【问题标题】:C# Linq, find lowest value in List<int> between two numbersC# Linq,在两个数字之间的 List<int> 中找到最小值
【发布时间】:2014-12-23 00:18:04
【问题描述】:

我知道以前有人问过这个问题,但其他问题只是关于查找 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。

【问题讨论】:

    标签: c# linq filtering


    【解决方案1】:
    var numbers = new List<int> { 2, 5, 7, 10 };
    var seven = numbers.Where(n => n <= 9).Max();
    

    【讨论】:

    • 想要使用聚合
    • @JABFreeware - 当这个答案比使用 Aggregate 更简单且更具可读性时,为什么要使用 Aggregate?
    • @mhawke 因为我厌倦了实现 Icomparable...这是一个自定义类型列表,其中包含一个 Number 字段而不仅仅是一个 List
    • @JABFreeware 在这种情况下怎么样? stackoverflow.com/a/1101979/2476884
    • @danielnixon 不寻找最大...我错过了什么吗?我累了……睡觉会在早上看书
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      即使@danielnixon 的答案也很好,这使用聚合

      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;
      

      【讨论】:

      • 随着列表变大(1000k 左右)的性能角度,使用 Abs 和 Aggregate 的方法往往会慢一些。您可能需要检查您的数据集是否更大。
      • 你确定吗?如果有必要,应该进行测试。试图猜测是不好的
      • 这里有一个问题:如果number 为0,或者其他一些小于列表中最小元素的值怎么办?此解决方案返回列表中的最大值 - 而不是想要的。使用Where 等的其他解决方案至少在这种情况下会引发异常。
      • @bto.rdz - 是的,用大数据集测试过
      猜你喜欢
      • 2013-11-10
      • 2019-06-11
      • 2012-04-24
      • 2020-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多