C# 使用LINQ转换IEnumerable的集合

C# 使用LINQ转换IEnumerable的集合,c#,linq,ienumerable,C#,Linq,Ienumerable,我有一个IEnumerable集合Car对象 汽车有一个属性:年 使用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 我预计2010年会有一份3人名单,2009年会有一份2人名单 这可能吗?尝试以下方法 List<Car> lis

我有一个
IEnumerable
集合
Car
对象

汽车有一个属性:年

使用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
我预计2010年会有一份3人名单,2009年会有一份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();
List=null;
IEnumerable ret=
从它的列表中
按它分组。年分为g
其中g.Count()>1
选择g.ToList();

您可以通过分组方式执行此操作。有关更多示例,请参阅

var result = from car in cars
             group car by car.year into g
             where g.Count() > 1
             select g
现在结果是一个
IEnumerable
,这意味着您可以执行以下操作:

foreach(var g in result)
{
    int year = g.Key;
    foreach(var car in g)
    {
        // list the cars
    }
}
IEnumerable carsGroupedByYear=
cars.GroupBy(c=>c.Year)/*按年份对汽车进行分组*/
.Where(g=>g.Count()>1)/*只接受元素大于1的组*/
.选择(g=>g.ToList());/*选择每个组作为列表*/

这与JaredPar的流畅语法需要一些爱是完全一样的。对你的例子没有批评,但有时我希望Linq至少有一个(int count)方法(我最后写了一个)。我知道这个组可能会在封面下返回一个ICollection,它在Count()中得到了优化,但每次我写或看到类似的内容时,它仍然让我担心。
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> */