删除列表中的重复对象(C#)
因此,我了解如何使用Linq中的删除列表中的重复对象(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,则它必须是非重复的
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。我假设它是一个字符串,这不是一个好的假设,并更新了响应。