c# 自定義排序Compare


.net FrameWork 框架博大精深,用着忘着,計划對自己能夠想到知識點梳理一下,此篇是對自定義排序的理解:

class Program {

        static void Main(string[] args)
        {
            Random random = new Random();
            ClassA[] arr = new ClassA[10];//數組還有IEnumerator是沒有實現Sort的,List實現了

            Console.WriteLine("Source Value:");
            for (int i = 0; i < 10; i++)
            {
                arr[i] = new ClassA(random.Next(10), random.Next(20));
                Console.WriteLine(arr[i].XY);
            }
            Console.WriteLine();
            Console.WriteLine("Source ToList Value:");
            var list = arr.ToList();
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(list[i].XY);
            }
            Console.WriteLine();
            Console.WriteLine("Source ToList Sort Value:");
            list.Sort();
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(list[i].XY);
            }
            Console.WriteLine();
            Console.WriteLine("Source ToList Compare Value:");
            list.Sort(new ClassAComparer());//簡單實現降序
            //等同於 list.Sort((x,y)=>-x.CompareTo(y));//實現降序
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(list[i].XY);
            }

            Console.WriteLine();
            Console.WriteLine("Priority Source Value:");
            //在一些常用場景經常會有優先級的概念,針對有優先級的排序,可以參照如下:
            //Tuple<int,int> ,Item1的優先級大於Item2的優先級
            List<Tuple<int, int>> list_priority = new List<Tuple<int, int>>(10);
            for (int i = 0; i < 10; i++)
            {
                Tuple<int, int> xy = new Tuple<int, int>(random.Next(5), random.Next(20));
                list_priority.Add(xy);
                Console.WriteLine(string.Format("{{X:{0},Y:{1}}}", xy.Item1, xy.Item2));
            }

            Console.WriteLine();
            Console.WriteLine("Priority Source Sort Value:");
            list_priority.Sort((x, y) =>
            {
                if (x.Item1 > y.Item1)
                    return 1;
                else if (x.Item1 == y.Item1)
                    return x.Item2 - y.Item2;
                else
                    return -1;
            });
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(string.Format("{{X:{0},Y:{1}}}", list_priority[i].Item1, list_priority[i].Item2));
            }
            Console.ReadKey();

            //其實還有一些場景,會用到權重的概念,尤其是針對一些客戶定級別時候,這個時候的排序,建議權重高的,
            //排序時候去平方,或者倍乘等方式,涉及到權重的,都是玄之又玄,出來的結果大致滿意就很棒了。。。
        }
    }

    class ClassA:IComparable<ClassA>//定義在對象上的自定義排序,這里引用泛型,不需類型轉換
    {
        public ClassA(int x, int y)
        {
            this.X = x;
            this.Y = y;
        }
        public int X { get; set; }

        public int Y { get; set; }

        public string XY
        {
            get
            {
                return string.Format("{{X:{0},Y:{1}}}", X, Y);//C#打印大括號,左大括號{{,有大括號}}
            }
        }

        public int CompareTo(ClassA other)
        {
            int val = X + Y;
            int otherVal = other.X + other.Y;
            return val - otherVal;//三種結果 1,-1,0分別是大,小,相等
        }
    }

    class ClassAComparer : IComparer<ClassA>//單獨定義的排序規則
    {
        public int Compare(ClassA x, ClassA y)
        {
            int valX = x.X + x.Y;
            int valY = y.X + y.Y;
            return valY - valX;
        }
    }

 在做一個對象集的比較時候,用到不同的比較規則,這個時候,用一個封裝,如下:

 public class Compare<T> : IEqualityComparer<T>
    {
        private Func<T,T,bool> _equalsComparer;

        public Compare(Func<T,T,bool> equalsComparer)
        {
            this._equalsComparer = equalsComparer;
        }

        public bool Equals(T x, T y)
        {
            if (null != this._equalsComparer)
                return this._equalsComparer(x, y);
            else
                return false;
        }

        public int GetHashCode(T obj)
        {
            return obj.GetHashCode();
        }
    }

 


免責聲明!

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



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