[轉]C# 中使用委托對List<>進行排序和篩選


一、使用委托對List<>進行排序

現有類A,含三個屬性,分別是NO,AGE,NAME,現在要求按照這個順序排序(既先比較NO,如果相同比較AGE,如果AGE相同就比較NAME)。

類A的代碼:

   1: class A
   2: {
   3:     private string _name;
   4:     public string NAME
   5:     {
   6:         get { return _name; }
   7:         set { _name = value; }
   8:     }
   9:  
  10:     private int _age;
  11:     public int AGE
  12:     {
  13:         get { return _age; }
  14:         set { _age = value; }
  15:     }
  16:  
  17:     private int _no;
  18:     public int NO
  19:     {
  20:         get { return _no; }
  21:         set { _no = value; }
  22:     }
  23:  
  24:     public A(int no, int age, string name)
  25:     {
  26:         this.NO = no;
  27:         this.AGE = age;
  28:         this.NAME = name;
  29:     }
  30: }

構造相應對象,對其進行排序測試:

   1: static void Main(string[] args)
   2: {
   3:     //構造數據
   4:     List<A> list = new List<A>();
   5:     list.Add(new A(20, 20, "00001"));
   6:     list.Add(new A(18, 50, "00003"));
   7:     list.Add(new A(20, 19, "00004"));
   8:     list.Add(new A(21, 21, "00005"));
   9:     list.Add(new A(19, 19, "00006"));
  10:     list.Add(new A(99, 19, "00007"));
  11:     list.Add(new A(19, 19, "00008"));
  12:     list.Add(new A(38, 50, "00009"));
  13:  
  14:     //進行排序
  15:     list.Sort(delegate(A a1, A a2)
  16:     {
  17:         if (a1.NO.CompareTo(a2.NO) != 0)
  18:             return a1.NO.CompareTo(a2.NO);
  19:         else if (a1.AGE.CompareTo(a2.AGE) != 0)
  20:             return a1.AGE.CompareTo(a2.AGE);
  21:         else
  22:             return a1.NAME.CompareTo(a2.NAME);
  23:     });
  24:  
  25:     //打印輸出
  26:     foreach (A a in list)
  27:     {
  28:         Console.WriteLine(a.NO + " " + a.AGE + " " + a.NAME);
  29:     }
  30:  
  31:     Console.ReadLine();
  32: }

 

其實這是用委托表示的方法對 List 的元素進行排序。內部實現則為QuickSort 算法。

詳情可參考:http://msdn.microsoft.com/zh-cn/library/w56d4y5z(VS.80).aspx

原文地址:http://www.cnblogs.com/liaozh/archive/2009/12/08/1619679.html

 

 

二、使用委托對List<>進行篩選

C#里 List 篩選是很簡單的事情,不用自已寫循環去遍歷,利用.net的特性 list.FindAll 可以很方便的實現。

   1: /// <summary>
   2: /// 根據匹配條件獲得子列表
   3: /// </summary>
   4: /// <param name="list"></param>
   5: /// <returns></returns>
   6: private List<BaseInfo> selectList(List<BaseInfo> list)
   7: {
   8:     string name = txtName.Text.Trim();
   9:     string nation = txtNation.Text.Trim();
  10:  
  11:     return list.FindAll(delegate(BaseInfo info)
  12:     {
  13:         if ((string.IsNullOrEmpty(name) || info.Name.IndexOf(name) != -1) && (string.IsNullOrEmpty(nation) || info.Nation.IndexOf(nation) != -1))
  14:         {
  15:             return true;
  16:         }
  17:         else
  18:         {
  19:             return false;
  20:         }
  21:     });
  22: }

 

   1: /// <summary>
   2: /// 從列表中獲得分頁數據
   3: /// </summary>
   4: /// <param name="list"></param>
   5: /// <param name="pageIndex"></param>
   6: /// <param name="pageSize"></param>
   7: /// <returns></returns>
   8: private List<BaseInfo> getPageData(List<BaseInfo> list, int pageIndex, int pageSize)
   9: {
  10:     return list.FindAll(delegate(BaseInfo info)
  11:     {
  12:         int index = list.IndexOf(info);
  13:         if (index >= (pageIndex - 1) * pageSize && index < pageIndex * pageSize)
  14:         {
  15:             return true;
  16:         }
  17:         else
  18:         {
  19:             return false;
  20:         }
  21:     });
  22: }

原文地址:http://lwbpeter.blog.163.com/blog/static/3850821120116183139512/


免責聲明!

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



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