как найти минимальную разницу объектов коллекции в c# linq - PullRequest
3 голосов
/ 06 марта 2020

У меня есть коллекция

Class MyData
{
 int f1;
 int f2;
 int f3;
 int f4;
}

var mycollection =List<MyData>();

Мне нужно вернуть объект с минимальной разницей между полями f1 и f3.

Я пытался выполнить запрос ниже

mycollection.select(obj => obj.f1 - obj.f3).Min();

Но он вернет число различий. Мне нужно вернуть объект. Я как бы пытаюсь получить объект с минимальной разницей

Я тоже пробовал это

mycollection.Select(obj => new { MyObject = obj,
                diff = obj.MaxTemparature - obj.MinimumTemparature, obj
            }).Min(obj => obj.diff);

Ответы [ 3 ]

5 голосов
/ 06 марта 2020

Попробуйте это

 MyData myData = mycollection.OrderBy(o => (o.f1 - o.f3)).First();
2 голосов
/ 06 марта 2020

Попробуйте, как показано ниже.

 mycollection.OrderBy(x => Math.Abs(x.f1 - x.f3)).FirstOrDefault();

Закажите свою коллекцию по разнице, и вы захотите minimal difference так использовать Math.Abs(x.f1 - x.f3). Затем возьмите FirstOrDefault объект.

Проверьте это здесь

2 голосов
/ 06 марта 2020

Вы можете выполнить следующие шаги, чтобы найти объект по разности F1 - F3.

  1. Рассчитать разницу с помощью .Select() и сохранить ее с фактическим объектом.
  2. Сортировать с помощью .OrderBy() и используйте разницу в качестве предиката.
  3. Получить первую запись из нее.

    var result = myData.Select(x => new {diff = Math.Abs(x.F1 - x.F3), obj = x})  //Step 1
                 .OrderBy(y => y.diff)   //Step 2
                 .FirstOrDefault();     //Step 3
    

Попробуйте онлайн


Или вы можете выполнить вычитание без .Select()

    var result = myData.OrderBy(x => Math.Abs(x.F1 - x.F3)).FirstOrDefault();     
...