tutorial listas generic example collection c# collections generic-collections

listas - C#/.NET equivalente para Java Collections.<T> emptyList()?



list object c# (8)

Comenzando con .net 4.6 también puede usar:

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

Esto solo crea una nueva instancia una vez para cada tipo diferente que especifique como T.

¿Cuál es la forma estándar de obtener una lista escrita y vacía en C #, o hay una?

ETA: Para aquellos que preguntan "¿por qué?": Tengo un método virtual que devuelve un IList (o más bien, post-respuestas, un IEnumerable ), y la implementación predeterminada está vacía. Lo que devuelva la lista debe ser de solo lectura porque escribirlo sería un error, y si alguien lo intenta, quiero parar y prender fuego inmediatamente, en lugar de esperar a que el error aparezca de una manera sutil más tarde.



Para ampliar la respuesta de Dan Tao , la siguiente implementación se puede usar de la misma manera que Enumerable.Empty<T>() , especificando List.Empty<T>() lugar.

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]; } }

Editar: modifico el código anterior para reflejar el resultado de una conversación con Dan Tao sobre la inicialización lenta o ansiosa del campo Instance .


Personalmente, creo que esto es mejor que cualquiera de las otras respuestas:

static readonly IList<T> EmptyList = new T[0];

  • Las matrices implementan IList<T> .
  • No puedes agregar a una matriz.
  • No se puede asignar a un elemento en una matriz vacía (porque no hay ninguno).
  • Esto es, en mi opinión, mucho más simple que la new List<T>().AsReadOnly() .
  • Aún puede devolver un IList<T> (si lo desea).

Por cierto, esto es lo que Enumerable.Empty<T>() realmente usa debajo del capó, si no recuerdo mal. Entonces teóricamente podrías incluso hacer (IList<T>)Enumerable.Empty<T>() (aunque no veo una buena razón para hacer eso).


Puedes simplemente crear una lista:

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

Si quiere un IEnumerable<T> vacío, use Enumerable.Empty<T>() :

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

Si realmente quieres una lista de solo lectura , podrías hacer:

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

Esto devuelve un ReadOnlyCollection<T> , que implementa IList<T> .


Qué pasa:

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

No estoy seguro de por qué lo quieres solo; sin embargo, eso no tiene mucho sentido en la mayoría de los escenarios en los que puedo pensar.


Si desea una lista cuyo contenido no se puede modificar, puede hacer lo siguiente:

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


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

O bien, si quiere un IEnumerable<> :

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