因此,我了解了如何使用Linq中的Distinct()删除列表中涉及字符串和int等的重复项。但是如何根据对象的特定属性删除重复项?

例如,我有一个TimeMetric类。该TimeMetric类具有两个属性:MetricTextMetricTime。我有一个称为TimeMetricsMetricList列表。我想删除具有相同TimeMetric属性的所有重复的MetricTextTimeMetric值可以相同,但是如果任何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)。如果0GetHashCode,则应该这样做并从MetricText返回null。另一方面,如果MetricText的类型是值类型,则无需执行任何修改。

进而:
var list = new List<TimeMetric> { ... };
var unique = list.Distinct(new MyComparer());

08-28 12:06