Как получить ближайший номер из списка с помощью LINQ?
Как получить ближайший номер от A 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 ответов:
если вы используете 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)
.
Если вы хотите использовать 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();
решения выше всех
O(N)
в лучшем случае.если у вас есть большой список, и вы выполняете этот запрос ближайшего элемента несколько раз, было бы более эффективно сначала отсортировать список (
O(NlogN)
), а затем использоватьList<T>.BinarySearch
для каждого запроса. Спектакль дляk
запросыO( (k+N)logN )
по сравнению сO(kN)
предыдущего метода.
вы могли бы вы двоичный поиск. Это метод сборки в c#, который поможет вам найти ближайший номер. Вот пример:https://msdn.microsoft.com/en-us/library/y15ef976 (v=vs. 110). aspx