Группировать по диапазону переменных целых чисел с помощью Linq

Я пытаюсь сгруппировать набор данных на основе диапазона целого числа, диапазон не увеличивается с фиксированным интервалом.

например У меня есть

ID предмета Цена
1 10
2 30
3 50
4 120

Я хотел бы сгруппировать товары по цене от 0 до 10, от 11 до 100 и от 100 до 500. Так что пункт 1 находится в группе А, пункт 2,3 в группе Б, пункт 4 в группе С.

Самое близкое, что я могу придумать, это элементы группировки предметов по (items.price / 10)

затем объедините группы вместе, чтобы получить разные диапазоны.

Любые идеи?


person Community    schedule 03.09.2009    source источник


Ответы (4)


Параметрирование списка потолков диапазона...

var ceilings = new[] { 10, 100, 500 };
var groupings = items.GroupBy(item => ceilings.First(ceiling => ceiling >= item));
person Av Pinzur    schedule 03.09.2009
comment
+1, потому что это, естественно, расширяется для самого общего случая, поскольку список потолков сам может быть динамически сгенерирован через Enumerable.Range().Select() - person Pavel Minaev; 04.09.2009

Как насчет чего-то подобного?

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 ) );
person jpbochi    schedule 03.09.2009

Возможно что-то вроде (не проверено):

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

(и группировать по этому)

Если это LINQ-to-Objects, вы также можете сделать это в статической служебной функции (GetBand(i) или аналогичной); или с LINQ-to-SQL вы можете сделать то же самое со скалярной UDF, сопоставленной с контекстом данных.

person Marc Gravell    schedule 03.09.2009

Вы можете выбрать целые числа в разных наборах с помощью Linq.

Что-то вроде:

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

Это даст вам все инты с определенного интервала.

person Robban    schedule 03.09.2009