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

Jay*_*Jay 18 c# linq list duplicate-removal

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

例如,我有一个TimeMetric班级.这个TimeMetric类有两个属性:MetricTextMetricTime.我有一个列表TimeMetricsMetricList.我想删除TimeMetric具有相同MetricText属性的任何重复项.该TimeMetric值可以是相同的,但如果任何TimeMetric具有相同的MetricText,它必须是不重复的.

Jon*_*Jon 21

您需要使用第二个重载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();
    }
}
Run Code Online (Sandbox Code Playgroud)

重要提示:上面的代码没有检查MetricText属性的情况null(听起来可能是这样,因为它很可能是一个string).你应该做的,并返回0GetHashCode如果MetricTextnull.另一方面,如果类型MetricText是值类型,则不需要执行任何修改.

然后:

var list = new List<TimeMetric> { ... };
var unique = list.Distinct(new MyComparer());
Run Code Online (Sandbox Code Playgroud)


Rit*_*ton 14

使用linq:

var list = list 
    .GroupBy(i => i.MetricText)
    .Select(g => g.First())
    .ToList();
Run Code Online (Sandbox Code Playgroud)

或者传入使用该属性的比较器:

public class mtCompare : IEqualityComparer<TimeMetric>
{
  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());
Run Code Online (Sandbox Code Playgroud)