.
List 是在程式開發中很常使用到的資料結構之一
在資料處理方面,可加入的資料類型種類非常多
如果以現有的規則進行排序,可能會無法達成需求
因此需要自訂規則來進行排序
以下主要介紹四種 List的排序方式
1. 使用 IComparer
主要為提供集合的排序,針對不同資料型態,會有不同的排序方法
例如 int 提供按整數大小進行排序;如果為 String則提供 字母 A - Z 的排序方法
2. 使用 LinQ
LINQ全名為Language Integrated Query
利用標準查詢運算子(Standard Query Operators)可以用原生的C#語言對資料做處理,選擇資料來源、進行篩選到組合、分組都可以利用標準查詢運算子完成,而且在撰寫的過程中還可以得到型別檢查及自動完成帶來的便捷
3. 使用 delegate
此方法為第一種方法的簡化寫法,在第一種寫法中
需要再建立一個新的class才可以使用,使用上較複雜且不易維護
使用委派則可直接對資料進行處理而不需透過class進行
4. 使用Lambda
此方法屬於 LinQ中的一種表達式
也算是一種委派的方法
功能上算是前兩者的綜合體
以下為實作程式碼
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
-
- namespace List_Sorting
- {
- public partial class Form1 : Form
- {
- private List<String> _LS = new List<String>();
- private List<String> _origin_LS = new List<String>();
- private Random _R = new Random();
-
- public Form1()
- {
- InitializeComponent();
- }
-
- private void Form1_Load(object sender, EventArgs e)
- {
- label1.Text = "List All Member:\n(Unsort)";
- label2.Text = "Sort Method 1\nIComparer";
- label3.Text = "Sort Method 2\nlinQ";
- label4.Text = "Sort Method 3\ndelegate";
- label5.Text = "Sort Method 4\nLambda";
-
- _LS.Add("19_02_27_10");
- _LS.Add("20_02_25_02");
- _LS.Add("18_02_26_05");
- _LS.Add("03_02_25_12");
- _LS.Add("01_02_27_11");
- _LS.Add("03_02_11_01");
- _LS.Add("02_02_13_05");
- _LS.Add("09_02_19_11");
- _LS.Add("05_02_28_15");
- _LS.Add("33_02_25_16");
-
- _origin_LS = _LS.GetRange(0, _LS.Count); //backup
-
- list_all_element(richTextBox1, _LS);
-
- //sort method1 using IComparer
- _LS.Sort(new ListComparer()); // 依照前兩碼進行排序
- list_all_element(richTextBox2, _LS);
-
- recover_list_sorting();
-
- //sort method2 using linQ
- var result = from element in _LS
- orderby element.Substring(6, 5) // 依照後五碼進行排序
- select element;
- int i = 0;
- foreach (String element in result)
- {
- _LS[i] = element;
- i++;
- }
- list_all_element(richTextBox3, _LS);
-
- //sort method3 using delegate
- _LS.Sort(delegate(String E1, String E2) { return E1.CompareTo(E2); });
- list_all_element(richTextBox4, _LS);
-
- //sort method4 using Lambda
- _LS.Sort((String E1, String E2)
- => E1.Substring(9, 2).CompareTo(E2.Substring(9, 2)));
- // 依照後兩碼進行排序
- list_all_element(richTextBox5, _LS);
- }
-
- private void recover_list_sorting()
- {
- _LS = _origin_LS;
- }
-
- private void list_all_element(RichTextBox Rtxt, List<String> ls)
- {
- foreach (String item in _LS)
- {
- Rtxt.Text += item+ "\n";
- }
- }
-
- public class ListComparer : IComparer<String>
- {
- public int Compare(String LS_E1, String LS_E2)
- {
- return LS_E1.CompareTo(LS_E2);
- }
- }
- }
- }
執行結果