Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 选择字段之间差异最小的项目_C#_Lambda - Fatal编程技术网

C# 选择字段之间差异最小的项目

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

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

例如:学生{string Name,int ScoredMarks,int TotalMarks} 注:并非所有学生的总分都相同。 我必须选择总分和总分差异最小的学生。 我可以这样做

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
(但无论如何都没有坏处)。