10

我有一个List<T>where T 是一个自定义对象。我的对象都不相等,但有些对象可能具有相等的属性。有什么快速的方法可以通过比较属性来删除重复项?哪些重复项留在列表中并不重要。

4

4 回答 4

19

您可以使用它List<T>.RemoveAll来有效地执行此操作。

例如,如果你想删除Foo属性值为 42 的所有元素,你可以这样做:

theList.RemoveAll(i => i.Foo == 42);

如果您尝试按属性制作不同项目的列表,即:仅保留不同的 Foo 项目,我建议您执行以下操作:

HashSet<int> elements = new HashSet<int>(); // Type of property

theList.RemoveAll(i => !elements.Add(i.Foo));

这将跟踪哪些元素是“不同的”并删除所有其他元素。

于 2012-08-20T18:03:14.253 回答
8

根据属性值对对象进行分组,然后选择每个组中的第一项。像这样:

var distinctObjects = objects
    .GroupBy(x => x.Property)
    .Select(g => g.First());
于 2012-08-20T18:09:17.607 回答
2

IEqualityComparer<T>您可以创建一个通过比较属性来实现的新类。然后,您可以使用 linq 的Distinct方法来获取仅包含唯一元素的 IEnumerable。

于 2012-08-20T18:06:44.923 回答
0

您也可以从这里使用一个非常好的库http://powercollections.codeplex.com/并使用Algorithms.RemoveDuplicates方法。那个图书馆有更多的收藏品。

于 2012-08-20T18:05:20.233 回答