下拉選單項目文字格式為 "1_選項A"、"3_選項C" 等,資料庫無獨立排序欄位,需依前綴數字排序。傳統作法寫冒泡/選擇排序,現代 C# 推薦使用 LINQ 與泛型 List<T> 一行解決。
public static void SortByPrefixBubble(DropDownList ddl)
{
for (int i = 0; i < ddl.Items.Count; i++)
{
for (int j = i + 1; j < ddl.Items.Count; j++)
{
int valI = ExtractPrefixNumber(ddl.Items[i].Text);
int valJ = ExtractPrefixNumber(ddl.Items[j].Text);
if (valI > valJ)
{
var item = ddl.Items[j];
ddl.Items.RemoveAt(j);
ddl.Items.Insert(i, item);
}
}
}
}
private static int ExtractPrefixNumber(string text)
{
var match = System.Text.RegularExpressions.Regex.Match(text, @"^\d+");
return match.Success ? int.Parse(match.Value) : int.MaxValue; // 無數字者排最後
}
public static void SortByPrefixLinq(DropDownList ddl)
{
var sorted = ddl.Items.Cast<ListItem>()
.OrderBy(item => ExtractPrefixNumber(item.Text))
.ToList();
ddl.Items.Clear();
foreach (var item in sorted)
ddl.Items.Add(item);
}
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DropDownSort.aspx.cs" Inherits="WebApp.DropDownSort" %>
<html><body>
<form id="form1" runat="server">
<asp:DropDownList ID="ddlType" runat="server"></asp:DropDownList>
<asp:Button ID="btnSort" runat="server" Text="排序" OnClick="btnSort_Click" />
</form></body></html>
public partial class DropDownSort : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ddlType.Items.Add(new ListItem("--請選擇--", ""));
ddlType.Items.Add(new ListItem("3_第三項"));
ddlType.Items.Add(new ListItem("1_第一項"));
ddlType.Items.Add(new ListItem("4_第四項"));
ddlType.Items.Add(new ListItem("2_第二項"));
}
}
protected void btnSort_Click(object sender, EventArgs e)
{
SortByPrefixLinq(ddlType);
}
// 將上述 LINQ 方法放此處或共用工具類
}
| 方法 | 時間複雜度 | 程式碼行數 | 可讀性 |
|---|---|---|---|
| 冒泡/選擇排序 | O(n²) | ~30 行 | 低 |
| LINQ OrderBy | O(n log n) | ~8 行 | 高 |
資料量超過百項時,LINQ 優勢明顯。若極度追求效能可改用 List<ListItem> 配合 Sort(Comparison<T>) 避免轉型開銷。