【问题标题】:Grouping a range using linq使用 linq 对范围进行分组
【发布时间】:2014-01-23 19:39:47
【问题描述】:

我有对象列表 (ID,Price,SalesID)
如何根据价格值范围对该列表进行分组?

说从 0-10,10-20,>20

我希望输出为组列表

0-9 -> object1,object2  
10-20 -> object3,object5,object7
>20   -> object8,object10,object11..

【问题讨论】:

  • 在什么情况下?内存中的 LINQ 还是某些 SQL 提供程序的 LINQ?
  • 这个问题有点不一致,因为你有两组价格 10。如果您可以更清楚地定义您的组,我认为@StevieB 的解决方案会为您提供帮助。

标签: c# linq


【解决方案1】:

这会将它们分组在 >20、10-20、

objects.GroupBy(x => x.Price > 20 ? 2 : x.Price >= 10 ? 1 : 0)

【讨论】:

  • 我认为这不是 Robert_Junior 的本意。他正在寻找非常具体的范围(0-10、10-20、> 20)。
  • @MauroCerutti 完全正确
  • 是的。更新了答案。
【解决方案2】:

我会创建包含范围名称的组:

var result = prices.GroupBy(x => x.Price < 10 ? "0-10" 
                                              : x.Price < 20 ? "10-20" : ">20")
                   .Select(g => new { g.Key, g }

(假设

【讨论】:

  • x.Price
【解决方案3】:

你可以这样做:

定义一个enum 来代表你的范围:

public enum PriceRange {
   LessThanTen,
   TenToTwenty,
   MoreThanTwenty
}

然后在某处定义类似如下的方法:

private static PriceRange ExtractRange(MyClass o) {
    if (o.Price < 10)
        return PriceRange.LessThanTen;
    else if (o.Price <= 20)
        return PriceRange.TenToTwenty;
    else
        return PriceRange.MoreThanTwenty;
}

你可以这样做:

var groups = myObjects.GroupBy(m => ExtractRange(m));

你可以这样输出:

foreach( var g in grp ) {
        Console.WriteLine("{0} -> {1}", g.Key, string.Join(",", g.Select(o => o.ToString())));
    }

假设你反对的ToString() 输出了一些对你有用的东西。

【讨论】:

    【解决方案4】:

    这应该可行:

    objects.GroupBy(o=>o.Price>=20?2:(int)(o.Price/10))
    

    【讨论】:

    • 这会将它们分成两个组,一个“在范围内”,另一个 - “不在范围内”。问题不同
    • 没错。实际上,这将取决于窗口的定义方式。
    猜你喜欢
    • 1970-01-01
    • 2018-06-22
    • 2012-08-29
    • 2010-10-03
    • 2015-11-25
    • 2018-12-27
    • 2023-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多