C# 选择字段之间差异最小的项目
我有一份物品清单。 我必须选择两个属性之间差异最小的项目 例如:学生{string Name,int ScoredMarks,int TotalMarks} 注:并非所有学生的总分都相同。 我必须选择总分和总分差异最小的学生。 我可以这样做C# 选择字段之间差异最小的项目,c#,lambda,C#,Lambda,我有一份物品清单。 我必须选择两个属性之间差异最小的项目 例如:学生{string Name,int ScoredMarks,int TotalMarks} 注:并非所有学生的总分都相同。 我必须选择总分和总分差异最小的学生。 我可以这样做 int minDiff = students.Min(x => (x.TotalMarks - x.ScoredMarks)); var result = from s in students where s.TotalMar
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)
{
// ...
}
如果您想获得最佳性能,应使用双向飞碟的MinBy
。我的方法需要按值排序所有项目,然后再选择差异最小的项目
如果我必须选择具有最小差异的所有学生,即如果我有多个具有相同最小差异的学生,该怎么办
然后您可以使用GroupBy
:
var minDiffGroup = students
.GroupBy(x => Math.Abs(x.TotalMarks - x.ScoredMarks))
.OrderBy(g => g.Key)
.FirstOrDefault();
foreach(Student student in minDiffGroup)
{
// ...
}
您可以使用
Math.Abs
获得绝对差,按它排序并取第一个
Student minDiff = students
.OrderBy(x => Math.Abs(x.TotalMarks - x.ScoredMarks))
.FirstOrDefault();
if(minDiff != null)
{
// ...
}
如果您想获得最佳性能,应使用双向飞碟的MinBy
。我的方法需要按值排序所有项目,然后再选择差异最小的项目
如果我必须选择具有最小差异的所有学生,即如果我有多个具有相同最小差异的学生,该怎么办
然后您可以使用GroupBy
:
var minDiffGroup = students
.GroupBy(x => Math.Abs(x.TotalMarks - x.ScoredMarks))
.OrderBy(g => g.Key)
.FirstOrDefault();
foreach(Student student in minDiffGroup)
{
// ...
}
试试这个:
Student TheOne = StudentList.OrderBy<Student, int>(x => x.TotalMarks - x.ScoredMarks).First<Student>();
Student TheOne=StudentList.OrderBy(x=>x.TotalMarks-x.ScoredMarks.First();
试试这个:
Student TheOne = StudentList.OrderBy<Student, int>(x => x.TotalMarks - x.ScoredMarks).First<Student>();
Student TheOne=StudentList.OrderBy(x=>x.TotalMarks-x.ScoredMarks.First();
我想你可以把两者结合起来
var result = from s in students
where s.TotalMarks - s.ScoredMarks == students.Min(x => (x.TotalMarks - x.ScoredMarks))
select s;
不过需要注意的是,这取决于您所查询的内容,而这些内容决定了这是一个性能更好的解决方案。如果它是linq to objects,那么每次都会运行student.Min(…),这是一种更糟糕的性能。如果是实体框架,那么整个lambda将转换为SQL,这是一种更好的性能。我认为您可以将两者结合起来
var result = from s in students
where s.TotalMarks - s.ScoredMarks == students.Min(x => (x.TotalMarks - x.ScoredMarks))
select s;
不过需要注意的是,这取决于您所查询的内容,而这些内容决定了这是一个性能更好的解决方案。如果它是linq to objects,那么每次都会运行student.Min(…),这是一种更糟糕的性能。如果是实体框架,则整个lambda将转换为SQL,这是一种更好的性能。具有MinBy和MaxBy函数:
为了进一步简化这一点,我建议在Students对象中添加一个属性
public int PriorTotalMarks { get { return this.TotalMarks - this.ScoredMarks; } }
附加属性可以绑定到datagrid、聚合等。。没有额外的复杂的减法
然后,使用Jon Skeet的MinBy,您只需写下:
Students.MinBy(s => s.PriorTotalMarks);
具有MinBy和MaxBy功能:
为了进一步简化这一点,我建议在Students对象中添加一个属性
public int PriorTotalMarks { get { return this.TotalMarks - this.ScoredMarks; } }
附加属性可以绑定到datagrid、聚合等。。没有额外的复杂的减法
然后,使用Jon Skeet的MinBy,您只需写下:
Students.MinBy(s => s.PriorTotalMarks);
回答得很好,但我会使用“FirstOrDefault()”。如果我必须选择所有差异最小的学生,即如果我有多个差异最小的学生,该怎么办。很抱歉,这将改变行为。最初的方法不使用Abs,您在这里添加了Abs()。这个问题意味着应该使用Abs,但他的示例代码没有这样做,因此您在这里的代码将返回不同的结果。@VVutpala:相应地编辑了我的答案。@CarstenSchütte:也许他的代码有效,因为TotalMarks总是大于ScoredMarks。所以我的答案也适用。除此之外,“我必须选择总分数和得分分数差异最小的学生。”听起来他可能需要
Math.Abs
(但无论如何都没有坏处)。答案很好,但我会使用“FirstOrDefault()“。如果我必须选择所有差异最小的学生,即如果我有多个差异最小的学生。对不起,这将改变行为。”。最初的方法不使用Abs,您在这里添加了Abs()。这个问题意味着应该使用Abs,但他的示例代码没有这样做,因此您在这里的代码将返回不同的结果。@VVutpala:相应地编辑了我的答案。@CarstenSchütte:也许他的代码有效,因为TotalMarks总是大于ScoredMarks。所以我的答案也适用。除此之外,“我必须选择总分和总分分数差异最小的学生。”听起来他可能需要Math.Abs
(但无论如何都没有坏处)。