c# lambda distinct


在寫程序的時候會遇見這樣的問題,那就是去重,有什么方法更快呢。
當去重時,首先想到的是自己寫代碼,代碼大概如下:

   private static void distinctListIntTest()
        {
            Console.WriteLine("未去重");
            List<int> list = new List<int>() { 1, 2, 3, 4, 1, 2, 3, 4 };
            foreach (int inst in list)
            {
                Console.WriteLine(inst);
            }
            Console.WriteLine("=======================");
            Console.WriteLine("去重后");
            List<int> list1 = new List<int>();
            foreach (int inst in list)
            {
                if (!list1.Contains(inst))
                {
                    list1.Add(inst);
                }
            }
            foreach (int inst in list1)
            {
                Console.WriteLine(inst);
            }
        }

這段代碼確實能實現我們想要的效果,結果如下:

這段代碼雖然能實現,但是要寫很多代碼,用起來不方便。有沒有更好的辦法呢,辦法是有的,那就是lambda表達式的distinct方法,代碼如下:

 private static void distinctListInt()
        {
            Console.WriteLine("未去重");
            List<int> list = new List<int>() { 1, 2, 3, 5, 1, 2, 3, 5 };
            foreach (int inst in list)
            {
                Console.WriteLine(inst);
            }
            Console.WriteLine("=======================");
            Console.WriteLine("去重后");
            list = list.Distinct().ToList();
            foreach (int inst in list)
            {
                Console.WriteLine(inst);
            }
        }

執行結果如下:

當簡單的類型可以了,那如果是一個對象怎么辦,用自己寫的方法代碼如下:
首先聲明一個對象

public class user
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

去重的方法

  private static void distinctListEntityTest()
        {
            Console.WriteLine("未去重");
            List<user> list = new List<user>();
            user user = new user() { Name = "張三", Age = 13 };
            list.Add(user);
            user = new user() { Name = "張三", Age = 13 };
            list.Add(user);
            user = new user() { Name = "李四", Age = 14 };
            list.Add(user);
            user = new user() { Name = "李四", Age = 14 };
            list.Add(user);
            user = new user() { Name = "王五", Age = 15 };
            list.Add(user);
            user = new user() { Name = "王五", Age = 15 };
            list.Add(user);
            foreach (user inst in list)
            {
                Console.WriteLine(inst.Name);
            }
            Console.WriteLine("=======================");
            Console.WriteLine("去重后");
            List<user> list1 = new List<user>();
            foreach (user inst in list)
            {
                bool isbool = true;
                foreach (user inst1 in list1)
                {
                    if (inst1.Name.Equals(inst.Name))
                    {
                        isbool = false;
                        break;
                    }
                }
                if (isbool)
                {
                    list1.Add(inst);
                }

            }
            foreach (user inst in list1)
            {
                Console.WriteLine(inst.Name);
            }
        }

去重的方法【lambda表達式】

  private static void distinctListEntityTest()
        {
            Console.WriteLine("未去重");
            List<user> list = new List<user>();
            user user = new user() { Name = "張三", Age = 13 };
            list.Add(user);
            user = new user() { Name = "張三", Age = 13 };
            list.Add(user);
            user = new user() { Name = "李四", Age = 14 };
            list.Add(user);
            user = new user() { Name = "李四", Age = 14 };
            list.Add(user);
            user = new user() { Name = "王五", Age = 15 };
            list.Add(user);
            user = new user() { Name = "王五", Age = 15 };
            list.Add(user);
            foreach (user inst in list)
            {
                Console.WriteLine(inst.Name);
            }
            Console.WriteLine("=======================");
            Console.WriteLine("去重后");
            List<user> list1=new List<user>();
            foreach (user inst in list)
            {
                if (list1.Count(u => u.Name.Equals(inst.Name))>0)//這句用了lambda表達式
                {
                    continue;
                }
                list1.Add(inst);
            }

            foreach (user inst in list1)
            {
                Console.WriteLine(inst.Name);
            }
        }

這兩種方法執行結果如下:

下面就用lambda表達式的distinct()方法代碼如下

    private static void distinctListEntity()
        {
            Console.WriteLine("未去重");
            List<user> list = new List<user>();
            user user = new user() { Name = "張三", Age = 13 };
            list.Add(user);
            user = new user() { Name = "張三", Age = 13 };
            list.Add(user);
            user = new user() { Name = "李四", Age = 14 };
            list.Add(user);
            user = new user() { Name = "李四", Age = 14 };
            list.Add(user);
            user = new user() { Name = "王五", Age = 15 };
            list.Add(user);
            user = new user() { Name = "王五", Age = 15 };
            list.Add(user);
            foreach (user inst in list)
            {
                Console.WriteLine(inst.Name);
            }
            Console.WriteLine("=======================");
            Console.WriteLine("去重后");

            list = list.Distinct(new userCompare()).ToList();
            foreach (user inst in list)
            {
                Console.WriteLine(inst.Name);
            }
        }
    }
    class userCompare : IEqualityComparer<user>
    {

        #region IEqualityComparer<user> Members

        public bool Equals(user x, user y)
        {

            return x.Name.Equals(y.Name);

        }

        public int GetHashCode(user obj)
        {

            return obj.Name.GetHashCode();

        }

        #endregion

    }

運行結果如下:

最后的lambda表達式的distinct()方法只是拋磚引玉,distinct()方法好像有更簡單的實現方法,歡迎為我解惑。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM