List <t>其中T是自定义对象。按属性删除重复项</t>

时间:2012-08-20 18:01:30

标签: c# linq list generics

我有一个List<T>,其中T是自定义对象。我的目标都不相同,但有些可能具有相同的属性。有没有通过比较属性来删除重复项的快速方法?哪个副本保留在列表中并不重要。

4 个答案:

答案 0 :(得分: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));

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

答案 1 :(得分:8)

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

var distinctObjects = objects
    .GroupBy(x => x.Property)
    .Select(g => g.First());

答案 2 :(得分:2)

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

答案 3 :(得分:0)

您也可以使用http://powercollections.codeplex.com/这里非常好的库并使用Algorithms.RemoveDuplicates方法。该图书馆还有很多其他收藏品。