zoukankan      html  css  js  c++  java
  • C# List集合去重操作注意点

    今天调试代码时发现list的distinct方法在对引用类型操作时并没有去重,后来查阅资料发现list去重操作对象集合时比较的是对象的一个个引用地址,

    因为集合里的对象都是一个个单独的实例,所以并不会把内容相同的元素去掉,要想真正去重还是要自己写方法筛选,但是值类型集合的就可以直接操作,包括Unoin,Intersect方法。

    当默认distinct方法不满足需求时,可以使用他的重载方法自定义一个比较器实现IEqualityComparer接口就行了

    这是一个在网上找的可拓展的泛型去重方法

    /// <summary>
    /// 可拓展的List对象集合去重比较器
    /// </summary>
    /// <typeparam name="T">要去重的对象类</typeparam>
    /// <typeparam name="C">自定义去重的字段类型</typeparam>
    public class Compare<T, C> : IEqualityComparer<T>
    {
    private Func<T, C> _getField;
    public Compare(Func<T, C> getfield)
    {
    this._getField = getfield;
    }
    public bool Equals(T x, T y)
    {
    return EqualityComparer<C>.Default.Equals(_getField(x), _getField(y));
    }
    public int GetHashCode(T obj)
    {
    return EqualityComparer<C>.Default.GetHashCode(this._getField(obj));
    }
    }

    /// <summary>
    /// 自定义Distinct扩展方法
    /// </summary>
    /// <typeparam name="T">要去重的对象类</typeparam>
    /// <typeparam name="C">自定义去重的字段类型</typeparam>
    /// <param name="source">要去重的对象</param>
    /// <param name="getfield">获取自定义去重字段的委托</param>
    /// <returns></returns>
    public static IEnumerable<T> MyDistinct<T, C>(this IEnumerable<T> source, Func<T, C> getfield)
    {
    return source.Distinct(new Compare<T, C>(getfield));
    }

     调用方式是 List.MyDistinct(s => s.ActivityId).ToList() //可以传委托也可以是匿名方法(lamda表达式)

  • 相关阅读:
    oracle 释放表空间到OS(resize)
    dblink查找对应的目标端session
    oralce move和shrink释放高水位
    使用ogg实现oracle到postgresql表的实时同步
    oracle_fdw的安装和使用
    postgresql数据库升级
    ORA-00054: 資源正被使用中, 請設定 NOWAIT 來取得它, 否則逾時到期
    贪心算法应用-哈夫曼编码
    9 深拷贝学习
    8 标准库C文件
  • 原文地址:https://www.cnblogs.com/zzlblog/p/9130002.html
Copyright © 2011-2022 走看看