c#对象集合去重_C# List集合去重操作注意点
今天調試代碼時發現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表達式)
總結
以上是生活随笔為你收集整理的c#对象集合去重_C# List集合去重操作注意点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kotlin 用协程做网络请求_Andr
- 下一篇: 5号出账15号还款什么意思