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

Dav*_*les 34 c# collections generic-collections

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

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

Dan*_*Tao 24

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

static readonly IList<T> EmptyList = new T[0];
Run Code Online (Sandbox Code Playgroud)
  • 数组实现IList<T>.
  • 您无法添加到数组.
  • 您不能分配到一个元素空数组(因为有无).
  • 在我看来,这比简单得多new List<T>().AsReadOnly().
  • 您仍然可以返回IList<T>(如果您愿意).

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

  • 从4.6开始,您甚至不再需要提供自己的对象,只需返回Array.Empty <T>(). (2认同)

Ree*_*sey 23

您只需创建一个列表:

List<MyType> list = new List<MyType>();
Run Code Online (Sandbox Code Playgroud)

如果你想要一个空的IEnumerable<T>,请使用Enumerable.Empty<T>():

IEnumerable<MyType> collection = Enumerable.Empty<MyType>();
Run Code Online (Sandbox Code Playgroud)

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

IList<MyType> readonlyList = (new List<MyType>()).AsReadOnly();
Run Code Online (Sandbox Code Playgroud)

这将返回一个ReadOnlyCollection<T>实现的IList<T>.

  • @JayR 空的只读集合非常适合 API 返回值,以便在不诉诸 `null` 的情况下传达“无结果”的想法。并且,理想情况下,您希望引用相同的只读、空集合,原因与您希望使用 `string.Empty` 的原因相同:内存保护。 (3认同)
  • 我也这么想,但后来看到了只读要求.然后我想到了一个空的只读List <T>的重点.我错过了什么? (2认同)

Luk*_*keH 8

IList<T> list = new List<T>().AsReadOnly();
Run Code Online (Sandbox Code Playgroud)

或者,如果你想要一个IEnumerable<>:

IEnumerable<T> sequence = Enumerable.Empty<T>();
Run Code Online (Sandbox Code Playgroud)


hai*_*ndl 7

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

IList<T> emptyList = Array.Empty<T>();
Run Code Online (Sandbox Code Playgroud)

这仅为您指定为T的每个不同类型创建一个新实例.

  • @David De Sloovere 由于字符串实习,空字符串文字 "" 也引用了相同的实例(只是告诉那些觉得有必要用 String.Empty 替换 "" 的读者)。 (2认同)