2011-01-26 5 views
6

У меня есть два выражения 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 }; 

Но это не совсем не отличается от того, что у меня уже есть - это просто вложенности первое выражение внутри второго. Есть ли другой способ, который объединяет два выражения в один?

+0

Кажется странным модель для меня. «Referrer» дает тот же рейтинг голосов каждому элементу в его списке предметов? Мне бы хотелось узнать, что вы моделируете. – Pedro

+0

Подумайте, как работает PageRank. Это не то, что я строю, но идея похожа. В основном, каждый реферер получает оценку 1.0, и этот счет равномерно распределяется по всем вещам, которые он перечисляет. Модель проста, но эффективна для того, что я делаю. –

ответ

4

Как насчет:

from r in Referrers 
from v in r.Items 
group r.VoteScore by v into g 
let score = g.Sum() 
orderby score descending 
select new { ItemNo = g.Key, Score = score } 
+0

Это, кажется, то, что я искал. Спасибо. Теперь я собираюсь изучить синтаксис группировки. Это так просто, что мой недостаток означает, что я не совсем понимаю группировку. –

+0

Ах, только что понял, в чем я оказался, это именно то, что у вас есть. Я больше сосредоточился на том, чтобы упростить то, что имел Джим, и не заметил, что «Элементы» были фактически «List », который изменил ситуацию из-за вложенного запроса и повторного использования переменной 'v'. –

Смежные вопросы