2011-01-26 69 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 } 
相关问题