2

我将使用一个包含大约 500,000 个项目的集合,并且正在寻找一种获得所有重复项的体面方法。看完这篇文章后,我发现最流行的解决方案是使用散列集。但是,如果我想获得所有具有红色的汽车而不仅仅是 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;
4

3 回答 3

9

您可以使用Enumerable.ToLookup 扩展方法按颜色对汽车进行分组并检索一种颜色的所有汽车:

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 }
于 2012-06-08T14:25:09.893 回答
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);

}
于 2012-06-08T14:27:26.027 回答
0

您可以研究使用字典创建各种查找表。例如,如果您想在 Car.Color 上进行查找,您将有一个 Dictionary>,因此每当添加一辆新车时,您还需要添加 Color 字典。

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

否则,使用 Enumerable.ToLookup() 是要走的路。请参阅此链接以了解 ToLookup() 的工作原理:

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

于 2012-06-08T14:28:43.233 回答