IComparer<T>比較兩個對象並返回一個值,指示一個對象是小於、等於仍是大於另外一個對象。javascript
在Linq當中,不少擴展方法接受一個實現IComparer<T>接口的實例的對象做爲參數,所以想明白Linq中不少個方法的IComparer<TKey> comparer參數的意義,首先要對此接口有個認識。html
該接口只有一個成員方法:java
CompareTo 比較當前對象和同一類型的另外一對象。git
此接口由值能夠排序的類型實現;例如數值或字符串類。值類型或類實現 CompareTo(T) 方法以建立適合排序等目的的類型特定的比較方法。框架
值 含義 post
小於零 第二個對象小於第一個對象學習
零 兩個對象相等this
大於零 第一個對象大於第二個對象spa
就是要記順序,很不爽。意思是這樣。傳入兩個參數,返回大於零則第一個參數大,小於0則第一個參數小。就這麼簡單,記住吧。code
可是在Linq擴展方法的參數裏, 默認是小於0的排在前面,你想哪一個大的排前,仍是小的排前就哪一個返回小於0的數值就能夠。
class Program { static void Main(string[] args) { People p1 = new People(1, "劉備", 23); People p2 = new People(1, "關羽", 22); People p3 = new People(1, "張飛", 21); List<People> listP = new List<People>(); listP.Add(p1); listP.Add(p2); listP.Add(p3); compares c = new compares(); IEnumerable<People> items = listP.OrderBy(p => p, c); foreach (People p in items) { Console.WriteLine(p.Name); //輸出張飛關羽劉備 } Console.ReadKey(); } } public class compares : IComparer<People> { public int Compare(People p1, People p2) { if (p1.Age > p2.Age) { return 1; } else if (p1.Age == p2.Age) { return 0; } else { return -1; } } } public class People { public People(int id, string name, int age) { this.Id = id; this.Name = name; this.Age = age; } public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } }