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

时间:2011-05-10 16:54:40

标签: c# linq list numbers

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

例如:

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

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

如何使用LINQ执行此操作?

6 个答案:

答案 0 :(得分:112)

如果您使用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)

答案 1 :(得分: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();

答案 2 :(得分:2)

上述解决方案充其量只有O(NlogN)

如果您有一个大的列表并且多次执行此最近元素查询,则首先对列表进行排序(List<T>.BinarySearch)然后对每个查询使用k会更高效。 O( (k+N)logN )个查询的效果为O(kN),与之前方法的%// create index matrix idx = bsxfun(@plus , deletevaluesatindex.', [0; 1]) %// create mask mask = zeros(numel(Z),1); mask(idx(:)) = (-1).^(0:numel(idx)-1) %// extract unmasked elements out = Z(~cumsum(mask)) 相比较。

答案 3 :(得分:0)

你可以进行二分查找。它是c#中的内置方法,可以帮助您搜索最接近的数字。例如:https://msdn.microsoft.com/en-us/library/y15ef976(v=vs.110).aspx

答案 4 :(得分:0)

这几天,也存在一个不错的选择:

List<int> list = new List<int> { 2, 5, 7, 10 };
int number = 9;

int min = list.Min(i => (Math.Abs(number - i), i)).i;

答案 5 :(得分:-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();

我希望这有用。