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)
| 归档时间: |
|
| 查看次数: |
19728 次 |
| 最近记录: |