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

删除列表中的重复对象(C#),c#,linq,list,duplicate-removal,C#,Linq,List,Duplicate Removal,因此,我了解如何使用Linq中的Distinct()删除列表中涉及字符串和int等的重复项。但是如何基于对象的特定属性删除重复项呢 例如,我有一个TimeMetric类。这个TimeMetric类有两个属性:MetricText和MetricTime。我有一个名为MetricList的TimeMetrics列表。我想删除具有相同MetricText属性的所有重复的TimeMetric。TimeMetric值可以相同,但如果任何TimeMetric具有相同的MetricText,则它必须是非重复的

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


例如,我有一个
TimeMetric
类。这个
TimeMetric
类有两个属性:
MetricText
MetricTime
。我有一个名为
MetricList
TimeMetrics
列表。我想删除具有相同
MetricText
属性的所有重复的
TimeMetric
TimeMetric
值可以相同,但如果任何
TimeMetric
具有相同的
MetricText
,则它必须是非重复的。

您需要使用将实例作为第二个参数的
Distinct
的第二个重载。定义一个比较器,如下所示:

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();
    }
}
bool Equals(TimeMetric x, TimeMetric y)
{
  return x.MetricText.Equals(y.MetricText);
}
你可以用一个

IEqualityComparer实现的equals方法如下所示:

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();
    }
}
bool Equals(TimeMetric x, TimeMetric y)
{
  return x.MetricText.Equals(y.MetricText);
}
使用linq:

var list = list 
    .GroupBy(i => i.MetricText)
    .Select(g => g.First())
    .ToList();
或传入使用属性的比较器:

公共类mtCompare:IEqualityComparer
{
公共布尔等于(时间度量x,时间度量y)
{
返回等于(x.MetricText,y.MetricText);
}
公共整数GetHashCode(时间度量obj)
{
返回obj.MetricText.GetHashCode();
}
}
....
list.Distinct(新的mtCompare());

这是不正确的,仅当
MetricText
类型为
string
(或替代
运算符==
的其他类型)时,它才会正常工作<应该改为使用code>Equals。我假设它是一个字符串,这不是一个好的假设,并更新了响应。