在 C# 中将 List 转换为只读的 List

开发
在 C# 编程中,有时候我们需要将一个 List<T> 转换为一个只读的集合,以防止其他代码修改该集合的内容。C# 提供了几种方法来实现这一点,本文将介绍几种常用的方法,并包含示例代码。

在 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。

责任编辑:赵宁宁 来源: 后端Q
相关推荐

2015-11-24 09:53:22

AngularJSXMLJSON

2021-01-30 11:12:21

C#List数据

2020-04-06 20:30:37

JavaScriptBoolean开发

2022-12-25 16:15:38

HTMLJava可视化文档

2022-09-22 11:40:11

JavaScript数组开发

2009-09-14 18:34:32

C# List排序

2021-06-07 12:20:14

LinuxASCII命令

2009-07-29 10:24:52

HTM转换为PDF

2024-03-12 07:35:39

Python字符串列表

2024-05-23 08:40:21

C#List映射工具

2021-12-29 07:56:32

Go byte io.Reader

2024-09-18 05:35:00

LINQC#

2009-07-31 14:09:41

c#时间格式转换

2009-11-02 17:15:42

C#转换为VB.NET

2016-11-15 14:29:14

Linux文件编码转换

2024-09-20 17:03:48

C#代码编程

2019-08-21 13:30:25

Node.jsSVG前端

2022-12-25 15:56:30

JavaScript字符串

2021-11-09 12:11:55

C# Redis队列

2009-08-24 09:55:26

C#接口转换
点赞
收藏

51CTO技术栈公众号