2010-09-22 16 views
4

J'ai une collection IEnumerable de Car objetscollection Convertir de IEnumerable LINQ

Une voiture a une propriété: Année

LINQ, je veux savoir où avec la même année il y a> 1 voitures et retourner cette liste.

j'attendre d'avoir à retourner un tableau de listes parce que si la collection est:

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

Je me attends à une liste de 3 pour 2010 et une liste de 2 pour 2009

est cela est-il possible?

Répondre

4

Vous pouvez le faire avec le groupe par. Voir hooked on linq pour plus d'échantillons

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

résultat maintenant est un IEnumerable<IGrouping<int, Car>>, ce qui signifie que vous pouvez faire ceci:

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

Non critism vous par exemple, mais parfois je souhaite que Linq avait un AtLeast (int count) méthode (j'ai fini par en écrire un). Je sais que Group retourne probablement une ICollection sous les couvertures qui est optimisée dans Count() mais ça m'inquiète toujours à chaque fois que j'écris ou vois quelque chose comme ça. –

2

Effectuez les opérations suivantes

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

C'est exactement la même réponse que la syntaxe –

+1

de JaredPar. – MatthewKing