如何使用 LINQ 从 List 中获取最接近的数字

本文关键字:获取 最接近 数字 int LINQ 何使用 List | 更新日期: 2023-09-27 17:55:46

如何使用 LINQ 从List<int>获取最接近的数字?

例如:

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

我需要在列表中找到最接近数字 9 的值。在本例中为 10.

如何使用 LINQ 执行此操作?

如何使用 LINQ 从 List<int> 中获取最接近的数字

如果您使用

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 Pegram 建议的解决方案稍微复杂一些,但它的优点是你不必先对列表进行排序。这意味着您的时间复杂度为 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会更有效率。与以前的方法相比O(kN)k查询的性能O( (k+N)logN )

如今,还存在一个不错且简单的选项:

List<int> list = new List<int> { 2, 5, 7, 10 };
int number = 9;
int min = list.Min(i => (Math.Abs(number - i), i)).i;

你可以进行二进制搜索。它是 c# 中的内置方法,可帮助您搜索最接近的数字。这里的例子: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();