C#Linq,在两个数字</int>之间的List <int>中找到最低值

时间:2014-12-22 03:43:14

标签: c# linq filtering

我知道之前已经问过这个问题,但其他问题只是关于找到CLOSEST。我不想那样。我需要两个值之间的最低值。例如,如果这是列表:  来自How to get the closest number from a List<int> with LINQ?的代码:

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

并且找到的数字是9,我希望它返回7项,而不是10项,即使它更接近。此代码找到最接近的代码,但是每次我更改它以找到它在其中输入的数字是列表中的一个数字之一(例如7或10)的其他情况下中断的最低值:

list.Aggregate((x,y) => Math.Abs(x-number) < Math.Abs(y-number) ? x : y);

如何更改代码以支持我需要做的事情?

我知道我可以使用二进制搜索...我不想使用它,我想尽可能使用linq。

3 个答案:

答案 0 :(得分:7)

var numbers = new List<int> { 2, 5, 7, 10 };
var seven = numbers.Where(n => n <= 9).Max();

答案 1 :(得分:1)

甚至@danielnixon答案都很好,这使用了agregate

int? closerLow = (int?) list.Aggregate((x,y) => Math.Abs(x-number) < Math.Abs(y-number) 
                     ? (x > number ? y : x ) 
                     : (y > number ? x : y));

if (closerLow > number) closerLow = null;

答案 2 :(得分:1)

如果你必须考虑列表中没有任何数字最接近的情况,代码看起来像,

    private static int? GetClosest(List<int> numbers, int number)
    {
        var shorterEnumerable = numbers.Where(x => x <= number);
        var shorterArray = shorterEnumerable as int[] ?? shorterEnumerable.ToArray();
        if (shorterArray.Length > 1)
            return shorterArray.Max();

        return null;
    }