如何从一个List <int>与LINQ获得最接近的数字?
如何从一个List<int>
与LINQ获得最接近的数字?
例如:
List<int> numbers = new List<int>(); numbers.Add(2); numbers.Add(5); numbers.Add(7); numbers.Add(10)
我需要find列表中最接近的数字9,在这种情况下10。
我怎样才能做到这一点与LINQ?
如果你使用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);
这个方法比Anthony Pegrambuild议的解决scheme稍微复杂一些,但是它的优点是你不必首先sorting列表。 这意味着你有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();
上面的解决scheme最好都是O(N)
。
如果您有一个大的列表,并且多次执行这个最接近元素的查询,那么首先对列表进行sorting( O(NlogN)
),然后对每个查询使用List<T>.BinarySearch
。 k
查询的性能是O( (k+N)logN )
,与前一个方法的O(kN)
相比较。
你可以你二进制search。 这是在C#中的内置方法,将帮助您search最接近的数字。 这里的例子: https : //msdn.microsoft.com/en-us/library/y15ef976(v=vs.110).aspx
根据您使用的条件,使用此得到最接近的更低或更高。
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();
我希望这有用。