我将使用一个包含大约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;
答案 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()如何工作的说明: