Как получить ближайший номер из списка <int>с помощью LINQ? - PullRequest
55 голосов
/ 10 мая 2011

Как получить ближайший номер от List<int> с помощью LINQ?

Например:

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

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

Как я могу сделать это с помощью LINQ?

Ответы [ 5 ]

115 голосов
/ 10 мая 2011

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

List<int> list = new List<int> { 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).

34 голосов
/ 10 мая 2011

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

List<int> list = new List<int> { 2, 5, 7, 10 };
int number = 9;

// find closest to number
int closest = list.OrderBy(item => Math.Abs(number - item)).First();
4 голосов
/ 10 сентября 2016

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

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

0 голосов
/ 11 декабря 2016

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

0 голосов
/ 10 сентября 2016

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

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

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

...