需要一种高效的方法来从列表中返回所有重复项

时间:2012-06-08 14:21:13

标签: c# linq lambda generic-list

我将使用一个包含大约500,000个项目的集合,并且正在寻找一种获得所有重复项目的正确方法。浏览this post后,我发现最流行的解决方案是使用散列集。但是,如果我想让所有颜色为红色的汽车不仅仅是Car4和Car5呢?

Car1.Color = Red;

Car2.Color = Blue;

Car3.Color = Green;

Car4.Color = Red;

Car5.Color = Red;

考虑到问题,这会是一种合理快速的方法吗?

编辑: 我在那篇文章中看到,下面的代码很容易改变,以满足我的需要。而且我不确定是否有更好的方法来解决问题,但我会留下帖子只是为了看。

var duplicates = from car in cars
                 group car by car.Color into grouped
                 from car in grouped
                 select car;

3 个答案:

答案 0 :(得分:9)

您可以使用Enumerable.ToLookup Extension Method按颜色对汽车进行分组并检索所有颜色的汽车:

var cars = new List<Car> { car1, car2, car3, car4, car5 };
var lookup = cars.ToLookup(car => car.Color);
var redCars = lookup[Red];
// redCars == { car1, car4, car5 }

答案 1 :(得分:1)

您可以按值使用

class Car {
    public Color { get; set; }
}

void Main()
{
     List<Car> cars = GetList(); // not important
     var grouped = cars.GroupBy(c=>c.Color);
     var duplicates = cars.Where(g=>g.Count()>1);

}

答案 2 :(得分:0)

您可以考虑使用Dictionary创建各种查找表。例如,如果你想在Car.Color上进行查找,你会有一个Dictionary&gt;,所以每当添加一辆新车时你也会添加Color字典。

这需要额外的内存使用和权衡。添加时间以便从更快的查找中受益,并且只有当您要通过相同的关键字段查找汽车的集合时才最有意义。

否则,使用Enumerable.ToLookup()是可行的方法。请参阅此链接以获取有关ToLookup()如何工作的说明:

http://msdn.microsoft.com/en-us/library/bb549073.aspx