因此,我了解了如何使用Linq中的Distinct()
删除列表中涉及字符串和int等的重复项。但是如何根据对象的特定属性删除重复项?
例如,我有一个TimeMetric
类。该TimeMetric
类具有两个属性:MetricText
和MetricTime
。我有一个称为TimeMetrics
的MetricList
列表。我想删除具有相同TimeMetric
属性的所有重复的MetricText
。 TimeMetric
值可以相同,但是如果任何TimeMetric
具有相同的MetricText
,则必须不重复。
最佳答案
您需要使用Distinct
的第二个重载,该重载将 IEqualityComparer<TimeMetric>
实例作为第二个参数。定义这样的比较器:
class MyComparer : IEqualityComparer<TimeMetric>
{
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
)。如果0
是GetHashCode
,则应该这样做并从MetricText
返回null
。另一方面,如果MetricText
的类型是值类型,则无需执行任何修改。进而:
var list = new List<TimeMetric> { ... };
var unique = list.Distinct(new MyComparer());