Как получить ближайшее число из списка <int> с LINQ?
Как получить ближайшее число из List<int>
с LINQ?
Например:
List<int> numbers = new List<int>();
numbers.Add(2);
numbers.Add(5);
numbers.Add(7);
numbers.Add(10)
Мне нужно найти самое близкое значение в списке до номера 9. В этом случае 10.
Как это сделать с LINQ?
Ответы
Ответ 1
Если вы используете 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)
.
Ответ 2
Если вы хотите использовать 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();
Ответ 3
Решения, указанные выше, в лучшем случае O(N)
.
Если у вас есть большой список и вы выполняете этот запрос ближайшего элемента несколько раз, было бы более удобно сортировать список сначала (O(NlogN)
), а затем использовать List<T>.BinarySearch
для каждого запроса. Производительность для запросов k
составляет O( (k+N)logN )
по сравнению с O(kN)
предыдущего метода.
Ответ 4
Вы можете найти двоичный поиск. Это метод сборки в С#, который поможет вам найти ближайший номер. Вот пример: https://msdn.microsoft.com/en-us/library/y15ef976(v=vs.110).aspx
Ответ 5
Используйте это, чтобы получить ближайшее или более высокое значение, основанное на условии, которое вы использовали.
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();
Я надеюсь, что это полезно.