【问题标题】:Is there a better way to combine these two Linq expressions?有没有更好的方法来结合这两个 Linq 表达式?
【发布时间】:2011-01-27 03:47:01
【问题描述】:

我有两个 LINQ 表达式,我认为我应该能够将它们组合成一个。

我有一个推荐人列表,每个推荐人都引用多个项目,我正在尝试确定最受欢迎的项目。每个推荐人都会将唯一的投票分数传递给被引用的项目。也就是说,referrer 1 可能会给出 0.2 票,referrer 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 };

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

【问题讨论】:

  • 对我来说似乎是一个奇怪的模型。 “推荐人”为其项目列表中的每个项目提供相同的投票分数?我很想知道你在建模什么。
  • 想想 PageRank 的工作原理。这不是我正在构建的,但这个想法是相似的。基本上,每个推荐人都得到 1.0 的分数,并且该分数均匀分布在其列表的所有内容中。该模型很简单,但对我正在做的事情很有效。

标签: c# linq


【解决方案1】:

怎么样:

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 所拥有的东西,并没有注意到 Items 实际上是 List&lt;int&gt;,由于嵌套查询和重用 v 变量而改变了事情。
猜你喜欢
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-29
  • 2010-10-06
  • 1970-01-01
相关资源
最近更新 更多