这两个Linq表达式有更好的结合方式吗?

6
我有两个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 };

但这并不与我已有的不同,只是将第一个表达式嵌套在第二个表达式内。是否有另一种方法将这两个表达式合并为一个?


对我来说这似乎是一个奇怪的模型。"引荐者"会给其项目列表中的每个项目相同的投票分数?我很想知道您在建模什么。 - Pedro
想一想PageRank是如何工作的。那不是我正在构建的东西,但这个想法是类似的。基本上,每个引用者都会得到1.0的分数,并且该分数均匀地分布在其列表中的所有内容上。这个模型很简单,但对于我正在做的事情非常有效。 - Jim Mischel
1个回答

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 }

那似乎就是我在寻找的东西。谢谢。现在我要去学习分组语法。这么简单,如果我错过了它,就意味着我没有完全理解分组。 - Jim Mischel
啊,我刚意识到我最终得到的东西正是你所拥有的。我更关注于简化Jim的内容,并没有注意到“Items”实际上是“List<int>”,这由于嵌套查询和重用“v”变量而改变了事情。 - Jeff Mercado

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接