我有项目清单。
我必须选择两个属性之间差异最小的项目。
例如:学生{字符串名称,整数ScoredMarks,整数TotalMarks}
注意:所有学生的总成绩不会相同。
我必须选择TotalMarks和ScoredMarks差异最小的学生。
我能够这样做
int minDiff = students.Min(x => (x.TotalMarks - x.ScoredMarks));
var result = from s in students
where s.TotalMarks - s.ScoredMarks == minDiff
select s;
我可以在一个语句中实现它吗?这样做的表现会是什么?
这将是乐观的
最佳答案
您可以使用Math.Abs
来获取绝对差值,并按其排序并获得第一个。
Student minDiff = students
.OrderBy(x => Math.Abs(x.TotalMarks - x.ScoredMarks))
.FirstOrDefault();
if(minDiff != null)
{
// ...
}
如果要获得最佳性能,则应使用Skeets MoreLinq的
MinBy
。我的方法需要按值对所有项目进行排序,然后才采用差异最小的项目。如果我必须选择所有具有最小差异的学生,即如果我有多个学生具有相同的最小差异怎么办。
然后,您可以使用
GroupBy
:var minDiffGroup = students
.GroupBy(x => Math.Abs(x.TotalMarks - x.ScoredMarks))
.OrderBy(g => g.Key)
.FirstOrDefault();
foreach(Student student in minDiffGroup)
{
// ...
}