list排序的三種實現方式
阿新 • • 發佈:2019-02-01
用了一段時間的gridview,對gridview實現的排序功能比較好奇,而且利用C#自帶的排序方法只能對某一個欄位進行排序,今天demo了一下,總結了三種對list排序的方法,並實現動態傳遞欄位名對list進行排序。
首先先介紹一下平時最常用的幾種排序方法。
第一種:實體類實現IComparable介面,而且必須實現CompareTo方法
實體類定義如下:
class Info:IComparable { public int Id { get; set; } public string Name { get; set; } public int CompareTo(object obj) { int result; try { Info info = obj as Info; if (this.Id > info.Id) { result = 0; } else result = 1; return result; } catch (Exception ex) { throw new Exception(ex.Message); } } }
呼叫方式如下,只需要用sort方法就能實現對list進行排序。
private static void ReadAccordingCompare() { List<Info> infoList = new List<Info>(); infoList.Add( new Info() { Id = 1, Name = "abc" }); infoList.Add(new Info() { Id = 3, Name = "rose" }); infoList.Add(new Info() { Id = 2, Name = "woft" }); infoList.Sort(); foreach (var item in infoList) { Console.WriteLine(item.Id + ":" + item.Name); } }
第二種方法:linq to list進行排序
運用linq實現對list排序,在實體類定義的時候就不需用實現IComparable介面,呼叫方式如下:
private static void ReadT(string str) { List<Info> infoList = new List<Info>(); infoList.Add( new Info() { Id = 1, Name = "woft" }); infoList.Add(new Info() { Id=3,Name="rose"}); infoList.Add(new Info() { Id = 2, Name = "abc" }); Console.WriteLine("ReadT*********************"); IEnumerable<Info> query = null; query = from items in infoList orderby items.Id select items; foreach (var item in query) { Console.WriteLine(item.Id+":"+item.Name); } }
但是上面兩種方式都只能對一個實體屬性排序,如果對不同的屬性排序的話只能寫很多的if進行判斷,這樣顯得很麻煩,而且還不能選擇排序規則。
且看下面的方式實現根據傳入引數排序。
private static void ListSort(string field,string rule)
{
if (!string.IsNullOrEmpty(rule)&&(!rule.ToLower().Equals("desc")||!rule.ToLower().Equals("asc")))
{
try
{
List<Info> infoList = GetList();
infoList.Sort(
delegate(Info info1, Info info2)
{
Type t1 = info1.GetType();
Type t2 = info2.GetType();
PropertyInfo pro1 = t1.GetProperty(field);
PropertyInfo pro2 = t2.GetProperty(field);
return rule.ToLower().Equals("asc") ?
pro1.GetValue(info1, null).ToString().CompareTo(pro2.GetValue(info2, null).ToString()) :
pro2.GetValue(info2, null).ToString().CompareTo(pro1.GetValue(info1, null).ToString());
});
Console.WriteLine("*****ListSort**********");
foreach (var item in infoList)
{
Console.WriteLine(item.Id + "," + item.Name);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
} Console.WriteLine("ruls is wrong");
}
呼叫方式:
ListSort("Name","desc");//表示對Name進行desc排序
ListSort("Id","asc");//表示對Id進行asc排序。如此如果引數很多的話減少了很多判斷。
如果有更好的方法歡迎大家提出,共同學習………..