C# Linq,在 List 中找到两个数字之间的最小值

本文关键字:两个 数字 最小值 之间 Linq List int | 更新日期: 2023-09-27 18:34:50

我知道这个问题以前被问过,但其他问题只是关于找到最接近的。我不想这样。我需要两个值之间的最低值。例如,如果这是列表:如何使用 LINQ 从 List 中获取最接近的数字的代码?:

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。

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

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

如果您必须考虑列表不会有任何数字最接近的情况,则代码如下所示:

    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;
    }

即使@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;