106

据我所知,.NET 4.0 仍然缺少只读列表。为什么框架仍然缺少这个功能?这不是领域驱动设计最常见的功能之一吗?

Java 相对于 C# 的少数优势之一是Collections.unmodifiablelist(list)方法的形式,它在 IList<T> 或 List<T> 中似乎早就应该使用了。

使用IEnumerable<T>是该问题的最简单解决方案 -ToList可以使用并返回副本。

4

7 回答 7

153

您正在寻找ReadOnlyCollection自 .NET2 以来一直存在的 .

IList<string> foo = ...;
// ...
ReadOnlyCollection<string> bar = new ReadOnlyCollection<string>(foo);

或者

List<string> foo = ...;
// ...
ReadOnlyCollection<string> bar = foo.AsReadOnly();

这将创建一个只读视图,它反映对包装集合所做的更改。

于 2009-06-11T22:19:58.807 回答
14

对于喜欢使用接口的人:.NET 4.5 增加了通用IReadOnlyList接口,List<T>例如实现。

它类似于IReadOnlyCollection并添加了Item索引器属性。

于 2015-09-07T07:45:10.810 回答
13

框架中已经存在的ReadOnlyCollection怎么样?

于 2009-06-11T22:17:45.393 回答
11

如果列表的最常见模式是遍历所有元素,IEnumerable<T>或者IQueryable<T>也可以有效地充当只读列表。

于 2009-06-11T22:21:07.820 回答
8

在 2.0 中,您可以调用AsReadOnly以获取列表的只读版本。或者将现有对象包装IListReadOnlyCollection<T>对象中。

于 2009-06-11T22:16:21.717 回答
7

System.Collections.ObjectModel.ReadOnlyCollection有什么问题?

于 2009-06-11T22:22:05.180 回答
0

在 IEnumerable 上创建一个扩展方法 ToReadOnlyList(),然后

IEnumerable<int> ints = new int[] { 1, 2, 3 };
var intsReadOnly = ints.ToReadOnlyList();
//intsReadOnly [2]= 9; //compile error, readonly

这是扩展方法

public static class Utility
{
    public static IReadOnlyList<T> ToReadOnlyList<T>(this IEnumerable<T> items)
    {
        IReadOnlyList<T> rol = items.ToList();
        return rol;
    }
}

也见马丁的回答

于 2021-04-15T22:12:38.143 回答