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