【问题标题】:Group by variable integer range using Linq使用 Linq 按变量整数范围分组
【发布时间】:2009-09-03 21:13:39
【问题描述】:

我正在尝试根据整数的范围对一组数据进行分组,该范围不会以固定的间隔增加。

例如我有

商品 ID 价格
1          10
2          30
3          50
4         120

我想将价格为 0 - 10、11 - 100 和 100-500 的商品分组。所以项目 1 在 A 组中,项目 2,3 在 B 组中,项目 4 在 C 组中。

我能想到的最接近的是 从项目 按 (items.price / 10 ) 对商品进行分组

然后将这些组连接在一起以获得不同的范围。

有什么想法吗?

【问题讨论】:

    标签: c# linq group-by


    【解决方案1】:

    参数化范围上限列表...

    var ceilings = new[] { 10, 100, 500 };
    var groupings = items.GroupBy(item => ceilings.First(ceiling => ceiling >= item));
    

    【讨论】:

    • +1 因为这对于最一般的情况自然是可扩展的,因为天花板列表本身可以通过Enumerable.Range().Select()动态生成
    【解决方案2】:

    这样的事情怎么样?

    var data = new[] {
        new { Id = 1, Price = 2 },
        new { Id = 1, Price = 10 },
        new { Id = 2, Price = 30 },
        new { Id = 3, Price = 50 },
        new { Id = 4, Price = 120 },
        new { Id = 5, Price = 200 },
        new { Id = 6, Price = 1024 },
    };
    
    var ranges = new[] { 10, 50, 100, 500 };
    
    var grouped = data.GroupBy( x => ranges.FirstOrDefault( r => r > x.Price ) );
    

    【讨论】:

      【解决方案3】:

      可能类似于(未经测试):

      item.Price <= 10 ? "A" :
           (item.Price <= 100 ? "B" : (item.Price <= 500 ? "C" : "X"))
      

      (并以此分组)

      如果这是 LINQ-to-Objects,您也可以在静态实用程序函数(GetBand(i) 或类似函数)中执行此操作;或者使用 LINQ-to-SQL,您可以对映射到数据上下文的标量 UDF 执行相同操作。

      【讨论】:

        【解决方案4】:

        您可以使用 Linq 选择不同集合中的整数。

        类似:

         var newList = theList.Where(i => i < 30 && i >10);
        

        这会让你得到某个时间间隔内的所有信息。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-09
          • 1970-01-01
          • 2016-12-04
          • 1970-01-01
          相关资源
          最近更新 更多