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

  • 相关阅读:
    新东西-intel edison
    MFC AfxMessageBox(_T("Please Load Rawdata First !"));
    libgl1-mesa-glx:i386 : 依赖: libglapi-mesa:i386
    开源硬件_瑞芯微开发板
    手机方案商
    嵌入式Linux应用开发__求职要求
    工作要求
    Proc文件系统接口调试
    Sysfs文件系统接口调试
    Ubuntu Linux 解决 bash ./ 没有那个文件或目录 的方法
  • 原文地址:https://www.cnblogs.com/zzlblog/p/9130002.html
Copyright © 2011-2022 走看看