删除列表中的重复对象(C#)

所以我理解如何通过使用Linq的Distinct()来删除列表和int等列表中的重复项。 但是,如何根据对象的特定属性删除重复项?

例如,我有一个TimeMetric类。 此TimeMetric类有两个属性: MetricTextMetricTime 。 我有一个名为MetricList列表。 我想删除任何具有相同MetricText属性的重复TimeMetricTimeMetric值可以相同,但如果任何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 )。 如果MetricTextnull ,您应该这样做并从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); }