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

ale*_*ale 57 c# linq numbers list

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

例如:

List<int> numbers = new List<int>();
numbers.Add(2);
numbers.Add(5);
numbers.Add(7);
numbers.Add(10)
Run Code Online (Sandbox Code Playgroud)

我需要在列表中找到最接近的值9.在这种情况下10.

如何使用LINQ执行此操作?

Eli*_*ing 124

如果您使用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);
Run Code Online (Sandbox Code Playgroud)

这种方法比Anthony Pegram建议的解决方案稍微复杂一些,但它的优势在于您不必先对列表进行排序.这意味着你有一个时间复杂度O(n)而不是O(n*log(n))和内存使用O(1)而不是O(n).

  • +1:聚合使用不够.很棒的答案. (2认同)

Ant*_*ram 34

如果要使用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();
Run Code Online (Sandbox Code Playgroud)

  • 这种解决方案的缺点是它必须首先对列表进行排序,如果列表很长,则会损害性能.有关在"O(n)"时间内返回值的解决方案,请参阅我的答案. (5认同)
  • 我更喜欢使用 LINQ 而不是扩展方法。然而,这仍然是漂亮的代码。没有过早的优化,只有简单干净的代码。+ 为此。 (3认同)

The*_*hos 5

上面的解决方案都是O(N)最好的。

如果您有一个大列表并且多次执行此最近元素查询,则先对列表进行排序 ( O(NlogN)) 然后再List<T>.BinarySearch用于每个查询会更高效。与之前的方法相比,k查询的性能是。O( (k+N)logN )O(kN)