我有一个List<T>
,其中T是自定义对象。我的目标都不相同,但有些可能具有相同的属性。有没有通过比较属性来删除重复项的快速方法?哪个副本保留在列表中并不重要。
答案 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
方法。该图书馆还有很多其他收藏品。