删除列表中的重复对象(C#)
所以我理解如何通过使用Linq的Distinct()
来删除列表和int等列表中的重复项。 但是,如何根据对象的特定属性删除重复项?
例如,我有一个TimeMetric
类。 此TimeMetric
类有两个属性: MetricText
和MetricTime
。 我有一个名为MetricList
列表。 我想删除任何具有相同MetricText
属性的重复TimeMetric
。 TimeMetric
值可以相同,但如果任何TimeMetric
具有相同的MetricText
,则它必须是不重复的。
您需要使用Distinct
的第二个重载,它将IEqualityComparer
实例作为第二个参数。 定义这样的比较器:
class MyComparer : IEqualityComparer { public bool Equals(TimeMetric x, TimeMetric y) { return x.MetricText.Equals(y.MetricText); } public int GetHashCode(TimeMetric obj) { return obj.MetricText.GetHashCode(); } }
重要说明:上面的代码没有检查MetricText
属性为null
(听起来可能是这样,因为它很可能是一个string
)。 如果MetricText
为null
,您应该这样做并从GetHashCode
返回0
。 另一方面,如果MetricText
的类型是值类型,则无需执行任何修改。
然后:
var list = new List { ... }; var unique = list.Distinct(new MyComparer());
使用linq:
var list = list .GroupBy(i => i.MetricText) .Select(g => g.First()) .ToList();
或者传入使用该属性的比较器:
public class mtCompare : IEqualityComparer { public bool Equals(TimeMetric x, TimeMetric y) { return Equals(x.MetricText, y.MetricText); } public int GetHashCode(TimeMetric obj) { return obj.MetricText.GetHashCode(); } } .... list.Distinct(new mtCompare());
您可以对IEqualityComparer使用Distinct重载 。
您的IEqualityComparer实现的equals方法如下所示:
bool Equals(TimeMetric x, TimeMetric y) { return x.MetricText.Equals(y.MetricText); }