2011-01-26 64 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

看起來像一個奇怪的模型給我。 「引用者」給出了其項目列表中每個項目的相同投票分數?我很想知道你在建模什麼。 – Pedro 2011-01-26 19:46:41

+0

想想PageRank是如何工作的。這不是我正在建造的,但這個想法是相似的。基本上,每個推薦人得分爲1.0,並且該分數均勻地分佈在所有列表中。該模型很簡單,但對我所做的事情有效。 – 2011-01-26 20:16:41

回答

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 } 
相關問題