Java Collections的C#/ .NET等价。<t> emptyList()?</t>

时间:2010-10-08 22:36:04

标签: c# collections generic-collections

在C#中获取类型化的,只读的空列表的标准方法是什么,或者有一个?

ETA:对于那些问“为什么?”的人:我有一个虚拟方法返回IList(或更确切地说,回复后,IEnumerable),以及默认实现为空。无论列表返回什么都应该是readonly因为写入它将是一个bug,如果有人试图,我想立即停止并着火,而不是等待bug稍后以某种微妙的方式出现。

8 个答案:

答案 0 :(得分:24)

就我个人而言,我认为这比任何其他答案都要好:

static readonly IList<T> EmptyList = new T[0];
  • 阵列实施IList<T>
  • 您无法添加到阵列。
  • 您无法分配空数组中的元素(因为 无)。
  • 在我看来,这比new List<T>().AsReadOnly()简单得多。
  • 您仍然可以返回IList<T>(如果您愿意)。

顺便说一下,如果我没记错的话,这就是Enumerable.Empty<T>()实际使用的内容。所以理论上你甚至可以(IList<T>)Enumerable.Empty<T>()(尽管我没有理由这样做)。

答案 1 :(得分:22)

您只需创建一个列表:

List<MyType> list = new List<MyType>();

如果您想要空IEnumerable<T>,请使用Enumerable.Empty<T>()

IEnumerable<MyType> collection = Enumerable.Empty<MyType>();

如果你真的想要只读列表,你可以这样做:

IList<MyType> readonlyList = (new List<MyType>()).AsReadOnly();

这会返回ReadOnlyCollection<T>,它会实现IList<T>

答案 2 :(得分:7)

IList<T> list = new List<T>().AsReadOnly();

或者,如果您想要IEnumerable<>

IEnumerable<T> sequence = Enumerable.Empty<T>();

答案 3 :(得分:6)

从.net 4.6开始,您也可以使用:

IList<T> emptyList = Array.Empty<T>();

这只为您指定为T的每种不同类型创建一个新实例。

答案 4 :(得分:4)

如果您想要一个无法修改其内容的列表,您可以执行以下操作:

ReadOnlyCollection<Foo> foos = new List<Foo>().AsReadOnly();

答案 5 :(得分:2)

从列表中构建System.Collections.ObjectModel.ReadOnlyCollection的实例。

List<int> items = new List<int>();
ReadOnlyCollection<int> readOnlyItems = new ReadOnlyCollection<int>(items);

答案 6 :(得分:2)

要展开Dan Tao's answer,通过指定Enumerable.Empty<T>(),可以采用与List.Empty<T>()相同的方式使用以下实现。

public static class List
{
    public static IList<T> Empty<T>()
    {
        // Note that the static type is only instantiated when
        // it is needed, and only then is the T[0] object created, once.
        return EmptyArray<T>.Instance;
    }

    private sealed class EmptyArray<T>
    {
        public static readonly T[] Instance = new T[0];
    }
}

编辑:我更改了上面的代码,以反映与Dan Tao讨论Instance字段的懒惰与急切初始化的结果。

答案 7 :(得分:-1)

怎么样:

readonly List<T> mylist = new List<T>();

不确定为什么要只读它;但是,在我能想到的大多数情况下,这都没有多大意义。