Как получить ближайшее число из списка с LINQ?

Как получить ближайшее число из List с LINQ?

Например:

 List numbers = new List(); numbers.Add(2); numbers.Add(5); numbers.Add(7); numbers.Add(10) 

Мне нужно найти ближайшее значение в списке до 9. В этом случае 10.

Как это сделать с LINQ?

Если вы используете LINQ для объектов, и список длинный, я бы использовал:

 List list = new List { 2, 5, 7, 10 }; int number = 9; int closest = list.Aggregate((x,y) => Math.Abs(x-number) < Math.Abs(y-number) ? x : y); 

Этот метод несколько более сложный, чем решение, предложенное Энтони Пегем, но у него есть преимущество, что вам не нужно сначала сортировать список. Это означает, что у вас есть временная сложность O(n) вместо O(n*log(n)) и использование памяти O(1) вместо O(n) .

Если вы хотите использовать LINQ для выполнения этой задачи, вы можете сделать это, как показано ниже.

 List list = new List { 2, 5, 7, 10 }; int number = 9; // find closest to number int closest = list.OrderBy(item => Math.Abs(number - item)).First(); 

Вышеприведенные решения – все O(N) в лучшем случае.

Если у вас есть большой список и вы выполняете этот запрос ближайшего элемента несколько раз, было бы более O(NlogN) сортировать список сначала ( O(NlogN) ), а затем использовать List.BinarySearch для каждого запроса. Производительность для k запросов равна O( (k+N)logN ) по сравнению с O(kN) предыдущего метода.

Вы могли бы выполнить двоичный поиск. Это метод сборки в c #, который поможет вам найти ближайший номер. Пример: https://msdn.microsoft.com/en-us/library/y15ef976(v=vs.110).aspx

Используйте это, чтобы получить ближайшее нижнее или высшее значение, основанное на условии, которое вы использовали.

  List list = new List { 2, 5, 7, 10 }; int number = 9; var closest = list.Where(numbers => numbers > number).First(); Console.WriteLine(closest); Console.ReadLine(); 

Надеюсь, это полезно.

Давайте будем гением компьютера.