92 votes

Existe-t-il un singleton "Empty List" en C# ?

En C#, j'utilise souvent LINQ et IEnumerable. Et tout va pour le mieux (ou du moins pour la plupart).

Cependant, dans de nombreux cas, je me retrouve à avoir besoin d'un vide IEnumerable<X> par défaut. C'est-à-dire que je voudrais

for (var x in xs) { ... }

pour fonctionner sans avoir besoin d'un contrôle de nullité. C'est ce que je fais actuellement, en fonction du contexte :

var xs = f() ?? new X[0];              // when xs is assigned, sometimes
for (var x in xs ?? new X[0]) { ... }  // inline, sometimes

Maintenant, alors que ce qui précède est parfaitement bien pour moi -- c'est-à-dire si la création de l'objet tableau entraîne des frais supplémentaires. ne s'en soucient pas -- Je me demandais.. :

Existe-t-il un singleton "empty immutable IEnumerable/IList" en C#/.NET ? (Et, même si ce n'est pas le cas, existe-t-il une "meilleure" façon de traiter le cas décrit ci-dessus).

Java a Collections.EMPTY_LIST singleton immuable -- "bien typé" via Collections.emptyList<T>() -- Je ne suis pas sûr qu'un concept similaire puisse fonctionner en C#, car les génériques sont gérés différemment.

Merci.

110voto

Stilgar Points 8165

Vous êtes à la recherche de Enumerable.Empty<T>() .

Par ailleurs, la liste vide de Java ne fonctionne pas parce que l'interface List expose des méthodes pour ajouter des éléments à la liste qui lèvent des exceptions.

56voto

Jon Points 194296

Enumerable.Empty<T>() est exactement ça.

21voto

ventiseis Points 698

Dans votre exemple original, vous utilisez un tableau vide pour fournir un énumérable vide. Alors que l'utilisation de Enumerable.Empty<T>() est parfaitement juste, il peut y avoir d'autres cas : si vous doivent utiliser un tableau (ou le IList<T> ), vous pouvez utiliser la méthode

System.Array.Empty<T>()

ce qui vous permet d'éviter les allocations inutiles.

Notes / Références :

20voto

svick Points 81772

Je pense que vous cherchez Enumerable.Empty<T>() .

Le singleton de liste vide n'a pas beaucoup de sens, car les listes sont souvent mutables.

10voto

Andrew Hanlon Points 2246

Je pense que l'ajout d'une méthode d'extension est une alternative propre grâce à leur capacité à gérer les nuls - quelque chose comme :

  public static IEnumerable<T> EmptyIfNull<T>(this IEnumerable<T> list)
  {
    return list ?? Enumerable.Empty<T>();
  }

  foreach(var x in xs.EmptyIfNull())
  {
    ...
  }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X