使用 LINQ 从所有子记录中查找字段的 MAX 或 MIN
请查看下面我的简短示例代码,并告诉我是否有更好、更紧凑的方法来编写 LINQ 查询。父类只是学生的姓名和考试成绩数据列表。子类是单个测试分数数据。我想从所有 TestScore 值中找到最差(或最好)的分数,然后确定分数最高的学生。
谢谢!
Dim query = From s In studentList _
Where s.ScoreList.Select(Function(d) d.TestScore).Min _
= studentList.SelectMany(Function(g) g.ScoreList).Select(Function(h) h.TestScore).Min _
Select StudentName = s.Student, _
WorstScore = s.ScoreList.Select(Function(g) g.TestScore).Min
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我不是 VB 人员,因此可能存在一些语法错误,但我可以建议两项改进:
不要在每个上找到总体最小值迭代;只需执行一次:
请注意,我已从查询中删除了匿名类型 - 我们已经知道
worstScore
,因此我们实际上不需要将其与查询结果一起使用。请注意,仍然可能有多名学生的成绩最差。I'm not a VB person so there may be some syntax errors, but I can suggest two improvements:
Don't find the overall minimum on every iteration; just do it once:
Note that I've removed the anonymous type from the query - we know the
worstScore
already, so we don't really need it in with the query result. Note that there could still be multiple students with that worst score though.如何
使用
OrderByDescending
和Max
来查找最佳分数。How about
Using
OrderByDescending
andMax
to find the best score.如果我是你,我要做的第一件事就是向
StudentScores
添加MinimumScore
和MaximumScore
属性,使AddScore
保留跟踪迄今为止您所看到的最低和最高分数。现在,对于给定的学生,您可以在O(1)
时间内找到这些,而不是在O(n)
时间内然后您要做的是编写
的实现>MaxBy
和MinBy
。我的 VB 讲得不太流利,但是您可以在之前的 MaxBy -in-c/4888703#4888703">回答并相应地转换为VB。最后,完成所有这些后,您可以说
(同样,您必须将其转换为 VB。)
The first thing I would do if I were you is add a
MinimumScore
andMaximumScore
property toStudentScores
makeAddScore
keep track of the minimum and maximum score that you've seen so far. Now for a given student you can find these inO(1)
time instead of inO(n)
timeThen what you want to do is write an implementation of
MaxBy
andMinBy
. I don't speak VB fluently, but you can find an implementation ofMaxBy
in C# in a previous answer and convert to VB accordingly.Finally, having done all this, you can say
(Again, you'll have to convert this to VB.)