在 C# 中將 List 轉(zhuǎn)換為只讀的 List
在 C# 編程中,有時(shí)候我們需要將一個(gè) List<T> 轉(zhuǎn)換為一個(gè)只讀的集合,以防止其他代碼修改該集合的內(nèi)容。C# 提供了幾種方法來實(shí)現(xiàn)這一點(diǎn),本文將介紹幾種常用的方法,并包含示例代碼。
方法一:使用 AsReadOnly 方法
List<T> 類提供了一個(gè) AsReadOnly 方法,它返回一個(gè) ReadOnlyCollection<T>,這是一個(gè)只讀的集合視圖。注意,ReadOnlyCollection<T> 只是一個(gè)包裝器,它不會(huì)復(fù)制原始列表的內(nèi)容,所以對(duì)原始列表的修改仍然會(huì)影響到這個(gè)只讀視圖,但你不能通過 ReadOnlyCollection<T> 進(jìn)行修改。
示例代碼
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 };
// 轉(zhuǎn)換為只讀集合
ReadOnlyCollection<int> readOnlyList = originalList.AsReadOnly();
// 可以讀取但不能修改
foreach (int item in readOnlyList)
{
Console.WriteLine(item);
}
// 下面的代碼將會(huì)編譯錯(cuò)誤,因?yàn)?readOnlyList 是只讀的
// readOnlyList.Add(6);
// 對(duì)原始列表的修改仍然會(huì)影響到只讀集合
originalList.Add(6);
Console.WriteLine("After adding to original list:");
foreach (int item in readOnlyList)
{
Console.WriteLine(item);
}
}
}
方法二:使用 LINQ 創(chuàng)建新的只讀集合
如果你希望創(chuàng)建一個(gè)完全獨(dú)立的只讀集合(即原始列表的修改不影響新集合),可以使用 LINQ 的 ToList 方法結(jié)合 AsReadOnly,或者直接使用 Array.AsReadOnly 將列表轉(zhuǎn)換為數(shù)組再包裝為只讀集合。
示例代碼
使用 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)建一個(gè)新的列表并轉(zhuǎn)換為只讀集合
ReadOnlyCollection<int> readOnlyList = originalList.ToList().AsReadOnly();
// 可以讀取但不能修改
foreach (int item in readOnlyList)
{
Console.WriteLine(item);
}
// 對(duì)原始列表的修改不會(huì)影響到新的只讀集合
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 };
// 將列表轉(zhuǎn)換為數(shù)組再包裝為只讀集合
ReadOnlyCollection<int> readOnlyList = Array.AsReadOnly(originalList.ToArray());
// 可以讀取但不能修改
foreach (int item in readOnlyList)
{
Console.WriteLine(item);
}
// 對(duì)原始列表的修改不會(huì)影響到新的只讀集合
originalList.Add(6);
Console.WriteLine("After adding to original list:");
foreach (int item in readOnlyList)
{
Console.WriteLine(item);
}
}
}
結(jié)論
在 C# 中,將 List<T> 轉(zhuǎn)換為只讀的集合主要有兩種方法:使用 AsReadOnly 方法獲得一個(gè) ReadOnlyCollection<T>,或者使用 LINQ 和數(shù)組的方法創(chuàng)建一個(gè)獨(dú)立的只讀集合。選擇哪種方法取決于你的具體需求,如果你希望原始列表的修改能夠反映到只讀集合中,可以使用 AsReadOnly;如果你希望創(chuàng)建一個(gè)完全獨(dú)立的只讀集合,則可以使用 LINQ 或 Array.AsReadOnly。