2010-09-22 4 views
4

У меня есть IEnumerable коллекция Car объектовколлекция Преобразовать из IEnumerable с помощью LINQ

Автомобиль имеет свойство: Год

Использование LINQ, я хочу, чтобы найти, где есть> 1 авто с того же года и верните этот список.

Я бы ожидать, что она должна возвращать массив списков, потому что если коллекция:

Car 1: Year 2010 
Car 2: Year 2010 
Car 3: Year 2009 
Car 4: Year 2009 
Car 5: Year 2010 
Car 6: Year 2008 

Я ожидал бы один список 3 за 2010 год и один список 2 на 2009

является это возможно?

ответ

4

Вы можете сделать это с группой по. См hooked on linq для более образцов

var result = from car in cars 
      group car by car.year into g 
      where g.Count() > 1 
      select g 

Теперь результатом является IEnumerable<IGrouping<int, Car>>, то есть вы можете сделать это:

foreach(var g in result) 
{ 
    int year = g.Key; 
    foreach(var car in g) 
    { 
     // list the cars 
    } 
} 
+0

Нет critism из вас пример, но иногда я хочу Linq имел по крайней мере (число INT) метод (я в конечном итоге написал один). Я знаю, что группа, вероятно, возвращает ICollection под обложки, оптимизированную в Count(), но она все равно беспокоит меня каждый раз, когда я пишу или вижу что-то вроде этого. –

2

Попробуйте следующее

List<Car> list = null; 
IEnumerable<List<Car>> ret = 
    from it in list 
    group it by it.Year into g 
    where g.Count() > 1 
    select g.ToList(); 
2
IEnumerable<List<Car>> carsGroupedByYear = 
    cars.GroupBy(c => c.Year) /* Groups the cars by year */ 
     .Where(g => g.Count() > 1) /* Only takes groups with > 1 element */ 
     .Select(g => g.ToList()); /* Selects each group as a List<Car> */ 
+0

Это точно такой же ответ, как и у JaredPar's –

+1

Для свободного синтаксиса нужна была какая-то любовь. – MatthewKing

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