Jay*_*Jay 18 c# linq list duplicate-removal
所以我理解如何通过使用Distinct()
来自Linq的字符串和int等来删除列表中的重复项.但是,如何根据对象的特定属性删除重复项?
例如,我有一个TimeMetric
班级.这个TimeMetric
类有两个属性:MetricText
和MetricTime
.我有一个列表TimeMetrics
叫MetricList
.我想删除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
).你应该做的,并返回0
从GetHashCode
如果MetricText
是null
.另一方面,如果类型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)