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

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

但这与我已有的并没有什么不同——它只是将第一个表达式嵌套在第二个表达式中。有没有另一种方法可以将这两个表达式组合成一个?

最佳答案

怎么样:

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 }

关于c# - 有没有更好的方法来组合这两个 Linq 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4808779/

相关文章:

c# - cloudfront 私有(private)限时 url

c# - 在不同的命名空间 C# 中重写方法

c# - 是什么导致 BindingList<T> 中的 ListChangedType.ItemMoved ListChange 事件?

c# - 创建用于将元素添加到列表的流畅界面

c# - 模拟 IDbSet GetEnumerator 时 LINQ 失败

Ubuntu 上的 C# HTTPS 服务器

c# - 具有多个 where 子句的 Linq to Datatable

c# - IQueryable<T> 不包含 'Include' 的定义并且没有扩展方法 'Include'

c# - lambda 的 Linq 更新问题

c# - 如何将字符串数组(具有 xml 内容)转换为 XML 文件?