zoukankan      html  css  js  c++  java
  • C#分组方式比较

    测试方法:

    private static void Main(string[] args)
            {
                var list = new List<Person>();
                for (int i = 0; i < 1000000; i++)
                {
                    list.Add(new Person() { Age = 18, Name = "老石" });
                }
    
                var time1 = Time(() =>
                {
                    list.GroupBy(t => new { t.Age, t.Name })
                    .Select(t => t.FirstOrDefault())
                    .ToList();
                });
                Console.WriteLine($"分组耗时:{time1}");
    
    
                var time2 = Time(() =>
                {
                      list.Distinct(d => new { d.Age, d.Name }).ToList();
                 });
                Console.WriteLine($"HashSet耗时:{time2}");
    
    
                var time3 = Time(() =>
                {
                    list.Distinct((a, b) => a.Age == b.Age && a.Name == b.Name).ToList();
                });
                Console.WriteLine($"委托耗时:{time3}");
            }
    
            static long Time(Action action)
            {
                var stopwatch = new Stopwatch();
                stopwatch.Start();
                action();
                stopwatch.Stop();
                return stopwatch.ElapsedMilliseconds;
            }
    

      

       public static class DistinctTest
        {
    
            public static void Test()
            {
                var list = new List<Person>();
                for (int i = 0; i < 1000000; i++)
                    list.Add(new Person() { Age = 18, Name = "jeffcky" });
    
                list = list.GroupBy(t => new { t.Age, t.Name })
                    .Select(t => t.FirstOrDefault())
                    .ToList();
    
                list = list.Distinct(d => new { d.Age, d.Name }).ToList();
    
                list = list.Distinct((a, b) => a.Age == b.Age && a.Name == b.Name && a.count==b.count ).ToList();
            }
    
            public static IEnumerable<TScource> Distinct<TScource, TKey>(this IEnumerable<TScource> source,
                Func<TScource, TKey> keySelector)
            {
                var hashSet = new HashSet<TKey>();
                foreach (TScource element in source)
                {
                    if (hashSet.Add(keySelector(element)))
                        yield return element;
                }
            }
        }
    
    
        public class Person
        {
            public string Name { get; set; }
            public int Age { get; set; }
    
            public int count { get; set; }
        }
    

      委托:

     public static class Extensions
        {
            public static IEnumerable<T> Distinct<T>(
            this IEnumerable<T> source, Func<T, T, bool> comparer)
            where T : class
            => source.Distinct(new DynamicEqualityComparer<T>(comparer));
    
    
            public sealed class DynamicEqualityComparer<T> : IEqualityComparer<T>
            where T : class
            {
                private readonly Func<T, T, bool> _func;
    
                public DynamicEqualityComparer(Func<T, T, bool> func)
                {
                    _func = func;
                }
    
                public bool Equals(T x, T y) => _func(x, y);
    
                public int GetHashCode(T obj) => 0;
            }
        }
    

      

  • 相关阅读:
    【排序】题解_P1093奖学金
    简单了解连接服务器的要求
    centos7安装(纯文字版)
    JAVA虚拟机
    集合
    IO流
    反射
    多线程
    JAVA基础
    博客园皮肤文档
  • 原文地址:https://www.cnblogs.com/sunliyuan/p/12904982.html
Copyright © 2011-2022 走看看