У меня есть два выражения LINQ, которые, я думаю, я могу объединить в один.Есть ли лучший способ объединить эти два выражения Linq?
У меня есть список рефереров, каждый из которых ссылается на несколько элементов, и я пытаюсь определить самые популярные элементы. Каждый реферер передает уникальный счет голосов в ссылочный пункт. То есть, источник 1 может дать голос 0,2, а рефери 2 может дать голос 0,03.
упрощенный Referrer
класс:
class Referrer
{
public double VoteScore { get; private set; }
public List<int> Items { get; private set; }
public Referrer(double v)
{
VoteScore = v;
Items = new List<int>();
}
}
Мои два выражения Linq являются:
var Votes =
from r in Referrers
from v in r.Items
select new { ItemNo = v, Vote = r.VoteScore };
Это дает мне список:
ItemNo:1, Vote:0.2
ItemNo:3, Vote:0.2
ItemNo:1, Vote:0.03
Теперь я могу группу, сумму, и сортировать с моим вторым выражением:
var SortedByScore =
from v in Votes
group v by v.ItemNo into g
let score = g.Sum((v) => v.Vote)
orderby score descending
select new { ItemNo = g.Key, Score = score };
Можно ли объединить их в единое выражение? Я понимаю, что я могу приковать выражения, то есть:
var SortedByScore =
from v in
(from r in ActivatedReferrers
from v in r.Items
select new { ItemNo = v, Vote = r.VoteScore })
group v by v.ItemNo into g
let score = g.Sum((v) => v.Vote)
orderby score descending
select new { ItemNo = g.Key, Score = score };
Но это не совсем не отличается от того, что у меня уже есть - это просто вложенности первое выражение внутри второго. Есть ли другой способ, который объединяет два выражения в один?
Кажется странным модель для меня. «Referrer» дает тот же рейтинг голосов каждому элементу в его списке предметов? Мне бы хотелось узнать, что вы моделируете. – Pedro
Подумайте, как работает PageRank. Это не то, что я строю, но идея похожа. В основном, каждый реферер получает оценку 1.0, и этот счет равномерно распределяется по всем вещам, которые он перечисляет. Модель проста, но эффективна для того, что я делаю. –