代码之家  ›  专栏  ›  技术社区  ›  Konrad

使用具有特定条件的LINQ从列表中获取数字

  •  1
  • Konrad  · 技术社区  · 6 年前

    >= 41 而最大的名单是40它不会工作,所以我希望它返回40。

    var numbers = new[] {30, 20, 40};
    

    我希望它像:

    numbers.GetNearest(45) -> 40
    numbers.GetNearest(40) -> 40
    numbers.GetNearest(31) -> 40
    numbers.GetNearest(30) -> 30
    numbers.GetNearest(29) -> 30
    numbers.GetNearest(1) -> 20
    

    我现在的情况是:

    numbers.OrderBy(n => n).FirstOrDefault(n => n >= minute)
    

    我不想要最近的号码,但要下一个 > 比我通过的那一个大,但是对于某些比列表中最大的大的数字不起作用,所以我只想返回最后一个。

    4 回复  |  直到 6 年前
        1
  •  5
  •   fubo    6 年前

    定义特殊情况 DefaultIfEmpty()

    var numbers = new[] { 30, 20, 40 };
    Array.Sort(numbers);
    int result = numbers.Where(n => n >= minute).DefaultIfEmpty(numbers.Last()).First();
    

    https://dotnetfiddle.net/nIEsRO

        2
  •  3
  •   TheGeneral    6 年前

    更新

    var numbers = new[]{30, 20, 40};
    var number = 25;
    var closest = numbers.OrderBy(n => n)
                         .Cast<int?>()
                         .FirstOrDefault(n => n >= number) ?? numbers.Last();
    Console.WriteLine(closest);
    

    :由于 default(int) 也许是个更好的方法

    30
    

    Full Demo Here


    原件

    你可以按差价点

    var closest = numbers.OrderBy(x => Math.Abs((long)x - number))
                         .First();
    
        3
  •  1
  •   apocalypse    6 年前

    你没有提供足够详细的具体情况,所以我只能给你这个答案:

    var numbers = new[] {30, 20, 40};
    
    var ordered = numbers.Select(x => (int?)x).OrderBy(x => x);
    
    int? value  = ordered.FirstOrDefault(x => x >= 41) ?? ordered.LastOrDefault();
    
        4
  •  0
  •   Konrad    6 年前

    有人贴了一个答案 Aggregate 但不是我想要的那样,而是删除了它。所以我用 骨料 OrderBy 首先我想:

    numbers.Aggregate((x, y) =>
    {
        var min = Math.Min(x, y);
        return number <= min ? min : Math.Max(x, y);
    });
    

    我花了一段时间才弄明白,但它解决了我的问题。如果你能看出它有什么缺点,请告诉我。