首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET Web Forms ArrayList 集合繫結:動態陣列、排序反轉、TrimToSize 與清單控制項繫結

     編輯:ASP.NET 基礎

ASP.NET Web Forms ArrayList 集合繫結:動態陣列、排序反轉、TrimToSize 與清單控制項繫結

ArrayList 是非泛型動態陣列,**自動擴容**、**支援索引存取**、**可排序/反轉**,是早期 ASP.NET 儲存單一值序列的常用集合。本文示範 ArrayList 建立、排序操作、繫結清單控制項、與泛型 List<T> 比較。

ArrayList 核心特性

  • 命名空間:System.Collections
  • 內部以陣列實作,預設容量 16,自動 2 倍擴容
  • 儲存單一值(非鍵值對),允許重複值、允許 null
  • Add(value) 尾端新增,Insert(index, value) 指定位置插入
  • Sort() 升冪排序,Reverse() 反轉順序
  • TrimToSize() 將容量調整為實際元素數量,釋放記憶體

完整實作範例:國家名稱選單

後端程式碼

<%@ Import Namespace="System.Collections" %>
<script runat="server">
    void Page_Load() {
        if (!IsPostBack) {
            ArrayList countries = new ArrayList();
            countries.Add("挪威");
            countries.Add("瑞典");
            countries.Add("法國");
            countries.Add("義大利");
            
            // 優化容量
            countries.TrimToSize();
            
            // 排序(字母順序:法國、義大利、挪威、瑞典)
            countries.Sort();
            
            // 若需降冪:countries.Reverse();
            
            rblCountries.DataSource = countries;
            rblCountries.DataBind(); // ArrayList 無 Key/Value,直接以值為 Text 與 Value
        }
    }
</script>

前端宣告

<html><body>
<form runat="server">
    <h3>國家選單(ArrayList 排序後):</h3>
    <asp:RadioButtonList ID="rblCountries" runat="server" />
</form>
</body></html>

ArrayList 完整操作指南

新增與插入

ArrayList list = new ArrayList();
list.Add("A");           // 索引 0
list.Add("B");           // 索引 1
list.Insert(1, "C");     // 索引 1 插入 "C",原 "B" 移至索引 2
// 結果:A, C, B

移除與搜尋

list.Remove("C");        // 移除第一個符合值
list.RemoveAt(0);        // 移除指定索引
list.RemoveRange(1, 2);  // 移除索引 1 起 2 個元素
int idx = list.IndexOf("B");  // 找值回傳索引(-1 表不存在)
bool exists = list.Contains("A");

排序與反轉

ArrayList nums = new ArrayList { 3, 1, 4, 1, 5, 9 };
nums.Sort();      // 1, 1, 3, 4, 5, 9
nums.Reverse();   // 9, 5, 4, 3, 1, 1

// 自訂排序:實作 IComparer
nums.Sort(new CustomComparer());

容量管理

ArrayList list = new ArrayList(100); // 指定初始容量 100
// ... 大量 Add ...
list.TrimToSize(); // 釋放多餘容量
int capacity = list.Capacity; // 目前配置容量
int count = list.Count;       // 實際元素數

轉型為陣列

string[] arr = (string[])list.ToArray(typeof(string));
// 或 .NET 2.0+ 泛型擴充方法
string[] arr2 = list.Cast<string>().ToArray();

ArrayList 繫結行為:單一值同時作為 Text 與 Value

<asp:DropDownList ID="ddlCountries" runat="server" 
    DataSourceID="alCountries" />

繫結結果:每個 ListItem 的 Text 與 Value 皆為 ArrayList 元素值。

注意:若需要 Text 與 Value 不同(如顯示名稱、實際值為代碼),請改用 Hashtable、SortedList 或 Dictionary<string,string>。

ArrayList vs List<T> 詳細比較

特性ArrayListList<T> (泛型)
型別安全否(object)是(編譯期檢查)
效能:值型別裝箱/拆箱開銷大無裝箱,效能優
效能:參考型別相近略優(無型別轉換)
語法便利性集合初始化器 .NET 3.0+完整支援、型別推論
LINQ 支援需 Cast<T>() 轉型原生支援
序列化XmlSerializer 支援有限完整支援
適用版本.NET 1.0+.NET 2.0+

現代化重構:List<string> 完整範例

<%@ Import Namespace="System.Collections.Generic" %>
<script runat="server">
    void Page_Load() {
        if (!IsPostBack) {
            // 型別安全、語法簡潔
            var countries = new List<string> { "挪威", "瑞典", "法國", "義大利" };
            
            // LINQ 排序
            var sorted = countries.OrderBy(c => c).ToList();
            
            rblCountries.DataSource = sorted;
            rblCountries.DataBind();
        }
    }
</script>

繫結至各類清單控制項

ArrayList/List<T> 皆可繫結:

  • RadioButtonList:單選群組
  • CheckBoxList:多選群組
  • DropDownList:下拉選單
  • ListBox:清單方塊(SelectionMode="Multiple" 支援多選)
  • BulletedList:項目符號清單
  • DataList/Repeater/GridView:資料繫結控制項(需包裝為物件或匿名型別)

進階:繫結複雜物件至清單控制項

若需 Text/Value 分離,建立簡單 DTO:

public class CountryItem {
    public string Code { get; set; }
    public string Name { get; set; }
}

// 後端
var items = new List<CountryItem> {
    new CountryItem { Code = "TW", Name = "台灣" },
    new CountryItem { Code = "JP", Name = "日本" }
};

ddlCountries.DataSource = items;
ddlCountries.DataTextField = "Name";
ddlCountries.DataValueField = "Code";
ddlCountries.DataBind();

常見問題排查

  • 排序例外:Sort() 要求所有元素實作 IComparable,混合型別會拋 InvalidOperationException
  • TrimToSize 後效能下降:後續 Add 會觸發重新配置陣列,僅在確定不再新增元素時呼叫
  • 繫結顯示型別名稱:直接繫結自訂物件未設定 DataTextField/DataValueField 時,會呼叫 ToString() 顯示型別名稱
  • 大量資料記憶體:ArrayList 擴容會配置 2 倍陣列並複製,大量資料預估筆數建議指定初始容量 new ArrayList(10000)

ArrayList 作為早期動態陣列實作已完成歷史使命,現代 ASP.NET 開發請全面採用 List<T> 享受型別安全、效能優勢與 LINQ 整合。下一節將總結資料繫結架構與支援繫結的控制項清單。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved