在 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 创建新的只读集合
如果你希望创建一个完全独立的只读集合(即原始列表的修改不影响新集合),可以使用 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 };
// 创建一个新的列表并转换为只读集合
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 和数组的方法创建一个独立的只读集合。选择哪种方法取决于你的具体需求,如果你希望原始列表的修改能够反映到只读集合中,可以使用 AsReadOnly;如果你希望创建一个完全独立的只读集合,则可以使用 LINQ 或 Array.AsReadOnly。