.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(); } }
