无法从groupby获取值

时间:2019-10-04 19:59:04

标签: c# linq collections group-by

因此,我试图从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语句创建的分数中不存在。任何帮助将不胜感激

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

像这样将用户和帖子组合在一起将导致性能下降。由于两个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返回可为空的值。如果null为空,则为p。参见:Null-conditional operators ?. and ?[]