有没有更好的方法来组合这两个Linq表达式?

时间:2011-01-26 19:04:59

标签: c# 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 };

但这与我已经拥有的并没有什么不同 - 它只是将第一个表达式嵌套在第二个表达式中。还有另一种方法将两个表达式合并为一个吗?

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 }