【问题标题】:Having trouble grabbing values from groupby无法从 groupby 中获取值
【发布时间】:2019-10-04 19:59:04
【问题描述】:

所以我试图从 2 个不同的集合中获取两个值,用户集合包含我需要的名称,而 Post 集合包含所需的分数。我正在尝试创建一个 LINQ 查询,该查询通过比较 ID 来获取用户发布的所有帖子,然后从该用户那里获得最低的帖子分数。这是我目前所拥有的:

这会打印出我需要的 2 个值,但不会按最小值对它们进行分组。

 var lowestQuery =
                from user in Assignment1.userDict
                from post in Assignment1.allPosts
                where user.Value.ID == post.AuthorID
                orderby user.Value.Name ascending
                group post.Score by new { user.Value.Name, post.Score } into scores
                select new
                {
                    name = scores.Key,
                    lowestScore = scores.Min()
                };

基本上只需要用户最低的帖子,但我在将两个值分组时遇到了麻烦。当我只是按 user.value.Name 分组时,我能够正确获取名称列表,但不能正确获取分数,因为它不存在于我使用 groupby 语句创建的分数中。任何帮助将不胜感激

【问题讨论】:

  • 如果您包含您的课程会有所帮助。试试:group post by new { user.Value.Name } into scores 然后在你的选择中你应该可以做lowestScore = scores.Min(p => p.Score)
  • @jcruz 这不起作用,因为一旦我进入 select 语句,它只会从我放置 groupby 的分数中获取值
  • @GertArnold 数据来自 LINQ 查询中的集合。这都是 C#
  • @HarryFischer 同样,在不知道您的模型是什么样子的情况下,我们只能猜测。试试我之前的建议,使用这个:group post by user.Value.Name into scores。您应该了解返回的组将是您的帖子记录,因此您应该能够从那里获得最低分数
  • @jcruz 哇,我错过了,谢谢。我能问一下你在 min(p=>p.score) 中的“p”是从哪里得到的吗?

标签: c# linq collections group-by


【解决方案1】:

由于您只对按用户名分组感兴趣,因此将您的 group by 子句调整为仅按用户名分组并返回帖子记录(我重命名为帖子,因为您正在检索帖子记录):

group post by user.Value.Name into posts

然后在您的选择中,您可以使用您的posts 组来选择Min 分数:

select new
{
     name = posts.Key,
     lowestScore = posts.Min(p => p.Score)
};

HTH

【讨论】:

    【解决方案2】:

    像这样结合用户和帖子会产生糟糕的表现。由于两个from 子句创建嵌套循环,您将有O(n^2) 的时间复杂度。最好使用群组加入

    var lowestQuery = from user in Assignment1.userDict.Values
        join post in Assignment1.allPosts on user.ID equals post.AuthorID into posts
        select new {
            name = user.Name,
            lowestScore = posts.DefaultIfEmpty().Select(p => p?.Score).Min()
        };
    

    请注意,如果集合为空,Min 方法将抛出异常。 DefaultIfEmpty 创建 null 项目。 p?.Score 返回一个可为空的值。如果p 为空,则为null。见:Null-conditional operators ?. and ?[]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-19
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多