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表达式)

  • 相关阅读:
    远程培训数据库迁移
    RMAN系列catalog数据库
    RMAN系列表空间恢复
    典型的一周备份脚本
    [转载]对 Oracle 备份与恢复 的补充说明转自tianlesoft的文章
    RMAN系列基于scn恢复
    使用Profile对用户Session会话进行资源限制
    RMAN系列控制文件、数据文件、redolog全部丢失
    全自动 TSPITR基于RMANLOGSEQ
    Oracle 10g EXPDP和IMPDP使用说明
  • 原文地址:https://www.cnblogs.com/zzlblog/p/9130002.html
Copyright © 2011-2022 走看看