使用linq对范围进行分组

时间:2014-01-23 10:46:30

标签: c# linq

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

从0-10,10-20,> 20

我想将输出作为一个群组列表

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

4 个答案:

答案 0 :(得分:3)

这会将它们分组在> 20,10-20,<10的范围内(即0-9,因为价格不能低于0我假设)。

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

答案 1 :(得分:1)

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

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

(假设&lt; 0不存在)

答案 2 :(得分:0)

这应该有效:

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

答案 3 :(得分:0)

您可以这样做:

定义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()输出对你有用的东西。