我有项目清单。
我必须选择两个属性之间差异最小的项目。

例如:学生{字符串名称,整数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 MoreLinqMinBy。我的方法需要按值对所有项目进行排序,然后才采用差异最小的项目。


  如果我必须选择所有具有最小差异的学生,即如果我有多个学生具有相同的最小差异怎么办。


然后,您可以使用GroupBy

var minDiffGroup = students
            .GroupBy(x => Math.Abs(x.TotalMarks - x.ScoredMarks))
            .OrderBy(g => g.Key)
            .FirstOrDefault();
foreach(Student student in minDiffGroup)
{
    // ...
}

10-07 20:10