今天调试代码时发现list的distinct方法在对引用类型操作时并没有去重,后来查阅资料发现list去重操作对象集合时比较的是对象的一个个引用地址,
因为集合里的对象都是一个个单独的实例,所以并不会把内容相同的元素去掉,要想真正去重还是要自己写方法筛选,但是值类型集合的就可以直接操作,包括Unoin,Intersect方法。
当默认distinct方法不满足需求时,可以使用他的重载方法自定义一个比较器实现IEqualityComparer接口就行了
这是一个在网上找的可拓展的泛型去重方法
///
/// 可拓展的List对象集合去重比较器
///
/// 要去重的对象类
/// 自定义去重的字段类型
public class Compare : IEqualityComparer
{
private Func _getField;
public Compare(Func getfield)
{
this._getField = getfield;
}
public bool Equals(T x, T y)
{
return EqualityComparer.Default.Equals(_getField(x), _getField(y));
}
public int GetHashCode(T obj)
{
return EqualityComparer.Default.GetHashCode(this._getField(obj));
}
}
///
/// 自定义Distinct扩展方法
///
/// 要去重的对象类
/// 自定义去重的字段类型
/// 要去重的对象
/// 获取自定义去重字段的委托
///
public static IEnumerable MyDistinct(this IEnumerable source, Func getfield)
{
return source.Distinct(new Compare(getfield));
}
调用方式是 List.MyDistinct(s => s.ActivityId).ToList() //可以传委托也可以是匿名方法(lamda表达式)