在 C# 中將 List 轉換為只讀的 List
在 C# 編程中,有時候我們需要將一個 List<T> 轉換為一個只讀的集合,以防止其他代碼修改該集合的內容。C# 提供了幾種方法來實現這一點,本文將介紹幾種常用的方法,并包含示例代碼。
方法一:使用 AsReadOnly 方法
List<T> 類提供了一個 AsReadOnly 方法,它返回一個 ReadOnlyCollection<T>,這是一個只讀的集合視圖。注意,ReadOnlyCollection<T> 只是一個包裝器,它不會復制原始列表的內容,所以對原始列表的修改仍然會影響到這個只讀視圖,但你不能通過 ReadOnlyCollection<T> 進行修改。
示例代碼
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
class Program
{
static void Main()
{
List<int> originalList = new List<int> { 1, 2, 3, 4, 5 };
// 轉換為只讀集合
ReadOnlyCollection<int> readOnlyList = originalList.AsReadOnly();
// 可以讀取但不能修改
foreach (int item in readOnlyList)
{
Console.WriteLine(item);
}
// 下面的代碼將會編譯錯誤,因為 readOnlyList 是只讀的
// readOnlyList.Add(6);
// 對原始列表的修改仍然會影響到只讀集合
originalList.Add(6);
Console.WriteLine("After adding to original list:");
foreach (int item in readOnlyList)
{
Console.WriteLine(item);
}
}
}
方法二:使用 LINQ 創(chuàng)建新的只讀集合
如果你希望創(chuàng)建一個完全獨立的只讀集合(即原始列表的修改不影響新集合),可以使用 LINQ 的 ToList 方法結合 AsReadOnly,或者直接使用 Array.AsReadOnly 將列表轉換為數組再包裝為只讀集合。
示例代碼
使用 ToList 和 AsReadOnly:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
class Program
{
static void Main()
{
List<int> originalList = new List<int> { 1, 2, 3, 4, 5 };
// 創(chuàng)建一個新的列表并轉換為只讀集合
ReadOnlyCollection<int> readOnlyList = originalList.ToList().AsReadOnly();
// 可以讀取但不能修改
foreach (int item in readOnlyList)
{
Console.WriteLine(item);
}
// 對原始列表的修改不會影響到新的只讀集合
originalList.Add(6);
Console.WriteLine("After adding to original list:");
foreach (int item in readOnlyList)
{
Console.WriteLine(item);
}
}
}
使用 Array.AsReadOnly:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
class Program
{
static void Main()
{
List<int> originalList = new List<int> { 1, 2, 3, 4, 5 };
// 將列表轉換為數組再包裝為只讀集合
ReadOnlyCollection<int> readOnlyList = Array.AsReadOnly(originalList.ToArray());
// 可以讀取但不能修改
foreach (int item in readOnlyList)
{
Console.WriteLine(item);
}
// 對原始列表的修改不會影響到新的只讀集合
originalList.Add(6);
Console.WriteLine("After adding to original list:");
foreach (int item in readOnlyList)
{
Console.WriteLine(item);
}
}
}
結論
在 C# 中,將 List<T> 轉換為只讀的集合主要有兩種方法:使用 AsReadOnly 方法獲得一個 ReadOnlyCollection<T>,或者使用 LINQ 和數組的方法創(chuàng)建一個獨立的只讀集合。選擇哪種方法取決于你的具體需求,如果你希望原始列表的修改能夠反映到只讀集合中,可以使用 AsReadOnly;如果你希望創(chuàng)建一個完全獨立的只讀集合,則可以使用 LINQ 或 Array.AsReadOnly。