zoukankan      html  css  js  c++  java
  • C# List去重DistinctBy扩展

    list 去重扩展:

     public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
            {
                HashSet<TKey> keys = new HashSet<TKey>();
                foreach (TSource element in source)
                    if (keys.Add(keySelector(element)))
                        yield return element;
            }
    

      比较两个集合

    public static bool CompareType<T>(T oneT, T twoT)
            {
                bool result = true;//两个类型作比较时使用,如果有不一样的就false
                Type typeOne = oneT.GetType();
                Type typeTwo = twoT.GetType();
                //如果两个T类型不一样  就不作比较
                if (!typeOne.Equals(typeTwo)) { return false; }
                PropertyInfo[] pisOne = typeOne.GetProperties(); //获取所有公共属性(Public)
                PropertyInfo[] pisTwo = typeTwo.GetProperties();
                //如果长度为0返回false
                if (pisOne.Length <= 0 || pisTwo.Length <= 0)
                {
                    return false;
                }
                //如果长度不一样,返回false
                if (!(pisOne.Length.Equals(pisTwo.Length))) { return false; }
                //遍历两个T类型,遍历属性,并作比较
                for (int i = 0; i < pisOne.Length; i++)
                {
                    //获取属性名
                    string oneName = pisOne[i].Name;
                    string twoName = pisTwo[i].Name;
                    //获取属性的值
                    object oneValue = pisOne[i].GetValue(oneT, null);
                    object twoValue = pisTwo[i].GetValue(twoT, null);
                    //比较,只比较值类型
                    if ((pisOne[i].PropertyType.IsValueType || pisOne[i].PropertyType.Name.StartsWith("String")) && (pisTwo[i].PropertyType.IsValueType || pisTwo[i].PropertyType.Name.StartsWith("String")))
                    {
                        if (oneName.Equals(twoName))
                        {
                            if (oneValue == null)
                            {
                                if (twoValue != null)
                                {
                                    result = false;
                                    break; //如果有不一样的就退出循环
                                }
                            }
                            else if (oneValue != null)
                            {
                                if (twoValue != null)
                                {
                                    if (!oneValue.Equals(twoValue))
                                    {
                                        result = false;
                                        break; //如果有不一样的就退出循环
                                    }
                                }
                                else if (twoValue == null)
                                {
                                    result = false;
                                    break; //如果有不一样的就退出循环
                                }
                            }
                        }
                        else
                        {
                            result = false;
                            break;
                        }
                    }
                    else
                    {
                        //如果对象中的属性是实体类对象,递归遍历比较
                        bool b = CompareType(oneValue, twoValue);
                        if (!b) { result = b; break; }
                    }
                }
                return result;
            }
    

      这种方法更快点:

         public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
            {
                HashSet<TKey> keys = new HashSet<TKey>();
                foreach (TSource element in source)
                    if (keys.Add(keySelector(element)))
                        yield return element;
            }
    

      

  • 相关阅读:
    顺序表代码(指针实现)
    顺序表代码
    爬虫问题之Unknown command: crawl
    MongoDB的启动
    python复制文件到文件夹中
    .content和.text的区别
    ip协议,IP,子网掩码,ping命令是什么
    网络通信流程
    tcp和udp得区别
    flask中的目录解析
  • 原文地址:https://www.cnblogs.com/sunliyuan/p/14547296.html
Copyright © 2011-2022 走看看