zoukankan      html  css  js  c++  java
  • 如何编写一个具有扩展性的去重方法

    3.如何编写一个具有扩展性的去重方法

    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));
    }
    }
    public static class CommonHelper
    {
    /// <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));
    }
    }


    复制代码
        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));
            }
        }
        public static class CommonHelper
        {
            /// <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.Id).ToList().ForEach(s => Console.WriteLine(s.ToString()));

    用到了泛型、委托、扩展方法等知识点。可以用于任何集合的各种去重场景

  • 相关阅读:
    【Silverlight】Bing Maps系列文章汇总
    《MEF程序设计指南》博文汇总
    Flash中各种图形的绘制
    Bing Maps开发扩展二:基于Oracle Spatial的空间数据分析
    Bing Maps开发扩展三:Bing Maps中渲染ESRI SHP空间数据
    Spring Cloud Gateway
    Spring Cloud Gateway 整合 nacos
    Spring Cloud Gateway 断言(Predicate) (hoxton 版本)
    Python和Node.js支持尾递归吗?
    用OpenCv来做人脸识别
  • 原文地址:https://www.cnblogs.com/yy1234/p/8961909.html
Copyright © 2011-2022 走看看