2014-01-23 3 views
0

У меня есть список объектов (ID, Price, SalesID)
Как я могу сгруппировать этот список в зависимости от диапазона значений цены?Группировка диапазона с использованием linq

Say от 0-10,10-20,> 20

Я хочу, чтобы как выводе списка групп

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

В каком контексте? LINQ в памяти или LINQ для какого-либо поставщика SQL? –

+0

Вопрос немного несовместим, так как у вас есть цена 10 в двух группах. Если вы сможете более четко определить свои группы, я думаю, что решение @ StevieB сделает для вас. – Brett

ответ

1

Я бы группы, содержащие имена диапазонов:

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

(при условии, что < 0 не существует)

+0

x.Цена <20 также будет охватывать случаи, когда x.Price <10. Возможно изменение порядка. – StevieB

+0

@StevieB Конечно. Поймал в названиях диапазонов, спасибо :) –

0

Это должно работать:

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

это сгруппирует их только в два gropus, один «в диапазоне» и другие - «не в радиусе». Вопрос был другой – Anarion

+0

, вы правы. Фактически, он будет зависеть от того, как определяются окна. –

3

Это будет сгруппировать их в диапазонах> 20, 10-20, < 10 (т. е. 0-9 по цене не может быть меньше 0).

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

Я думаю, что это не то, что предполагал Robert_Junior. Он ищет очень конкретные диапазоны (0-10, 10-20,> 20). –

+0

@MauroCerutti точно –

+0

Правда. Обновленный ответ. – StevieB

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() выводит что-то полезное для вас.

+0

Почему downvoting? Похоже, что OP хочет дискретных и четко определенных диапазонов ... –

Смежные вопросы