Comment initialiser un tableau vide dans C#?

est-il possible de créer un tableau vide sans spécifier la taille?

par exemple, j'ai créé:

String[] a = new String[5];

pouvons-nous créer le tableau de cordes ci-dessus sans la taille?

236
demandé sur Peter Mortensen 2012-01-04 16:49:04

12 réponses

Si vous allez utiliser une collection que vous ne connaissez pas la taille de l'avance, il ya de meilleures options que les tableaux.

utilisez un List<string> à la place - il vous permettra d'ajouter autant d'éléments que vous avez besoin et si vous avez besoin de retourner un tableau, appelez ToArray() sur la variable.

var listOfStrings = new List<string>();

// do stuff...

string[] arrayOfStrings = listOfStrings.ToArray();

si vous devez créer un tableau vide vous pouvez faire ceci:

string[] emptyStringArray = new string[0]; 
333
répondu Oded 2012-09-27 10:47:42

essayez ceci:

string[] a= new string[] { };
139
répondu hemant 2017-05-07 14:07:43

dans .Net 4.6 la méthode préférée est d'utiliser une nouvelle méthode, Array.Empty :

String[] a = Array.Empty<string>();

Le mise en œuvre est succincte, à l'aide de comment les membres statiques de classes génériques se comporter .Net :

public static T[] Empty<T>()
{
    return EmptyArray<T>.Value;
}

// Useful in number of places that return an empty byte array to avoid
// unnecessary memory allocation.
internal static class EmptyArray<T>
{
    public static readonly T[] Value = new T[0];
}

(le code du contrat a été supprimé pour plus de clarté)

voir aussi:

64
répondu Kobi 2017-05-23 12:26:27

vous pouvez l'initialiser avec une taille de 0, mais vous devrez le réinitialiser, quand vous savez quelle est la taille, car vous ne pouvez pas l'ajouter au tableau.

string[] a = new string[0];
28
répondu MatthiasG 2017-04-19 15:14:19

il n'y a pas beaucoup d'intérêt à déclarer un tableau Sans Taille. Un tableau est d'environ la taille . Lorsque vous déclarez un tableau de taille spécifique, vous spécifiez le nombre fixe de fentes disponibles dans une collection qui peut contenir des choses, et en conséquence la mémoire est allouée. Pour y ajouter quelque chose, vous devrez de toute façon réinitialiser le tableau existant (même si vous redimensionnez le tableau, voir ce thread ). L'un des rares cas où vous voulez initialiser un tableau vide serait de passer de tableau comme argument.

si vous voulez définir une collection quand vous ne savez pas quelle taille il pourrait être éventuellement, tableau n'est pas votre choix, mais quelque chose comme un List<T> ou similaire.

cela dit, la seule façon de déclarer un tableau sans spécifier la taille est d'avoir un tableau vide de taille 0 . hemant et Alex Dn offre deux façons. Une autre alternative plus simple est juste :

string[] a = { };

[ les éléments à l'intérieur du support doivent être implicitement convertibles en un type défini, par exemple, string[] a = { "a", "b" }; ]

Ou encore une autre:

var a = Enumerable.Empty<string>().ToArray();

Voici une façon plus déclarative :

public static class Array<T>
{
    public static T[] Empty()
    {
        return Empty(0);
    }

    public static T[] Empty(int size)
    {
        return new T[size];
    }
}

Maintenant vous pouvez appel:

var a = Array<string>.Empty();

//or

var a = Array<string>.Empty(5);
6
répondu nawfal 2017-05-23 12:10:41

Vous pouvez le faire:

string[] a = { String.Empty };

Note: OP signifie Ne pas avoir à spécifier une taille, ne pas faire un tableau sizeless

3
répondu vapcguy 2015-05-12 11:29:17

vous pouvez définir la taille du tableau à l'exécution .

cela vous permettra de faire n'importe quoi pour calculer dynamiquement la taille du tableau. Mais, une fois définie la taille est immuable.

Array a = Array.CreateInstance(typeof(string), 5);
2
répondu radarbob 2012-01-04 14:29:20

j'avais essayé:

string[] sample = new string[0];

mais je n'ai pu y insérer qu'une seule chaîne, et j'ai eu une exception sans erreur, donc j'ai simplement mis une taille pour ça, comme

string[] sample = new string[100];

Ou une autre manière de travailler pour moi:

List<string> sample = new List<string>();

attribuer une Valeur pour la liste:

sample.Add(your input);
2
répondu Cs_Lu 2017-05-07 14:10:29

comme je sais que vous ne pouvez pas faire tableau sans taille, mais vous pouvez utiliser""

List<string> l = new List<string>() 

puis l.ToArray() .

1
répondu Alex Dn 2013-09-10 14:04:06

Simple et élégant!

string[] array = {}
1
répondu disklosr 2016-12-25 14:08:50

Combining @nawfal & @Kobi suggestions:

namespace Extensions
{
    /// <summary> Useful in number of places that return an empty byte array to avoid unnecessary memory allocation. </summary>
    public static class Array<T>
    {
        public static readonly T[] Empty = new T[0];
    }
}

exemple d'utilisation:

Array<string>.Empty

HTH

0
répondu ShloEmi 2016-04-21 06:00:51

Voici un exemple réel. En cela, il est nécessaire d'initialiser le tableau foundFiles première longueur zéro.

(comme souligné dans d'autres réponses: ceci initialise pas un élément et surtout pas un élément avec index zéro parce que cela signifierait que le tableau avait la longueur 1. Le tableau a une longueur zéro après cette ligne!).

si la partie = string[0] est omise, il y a une erreur de compilation!

C'est à cause de le catch block sans rethrow. Le compilateur C # reconnaît le chemin de code, que la fonction Directory.GetFiles() peut lancer une Exception, de sorte que le tableau pourrait être uninitialisé.

avant que quelqu'un ne dise, ne pas repenser l'exception serait une mauvaise gestion des erreurs: ce n'est pas vrai. Le traitement des erreurs doit être adapté aux exigences.

dans ce cas, il est supposé que le programme devrait continuer dans le cas d'un répertoire qui ne peut pas être lu, et ne pas casser - le meilleur exemple: une fonction traversant une structure de répertoire. Ici, la gestion des erreurs n'est qu'une journalisation. Bien sûr, cela pourrait être mieux fait, par exemple en collectant tous les répertoires avec des appels GetFiles(Dir) manqués dans une liste, mais cela mènera trop loin ici.

il suffit de déclarer qu'éviter throw est un scénario valide, et donc le tableau doit être initialisé à la longueur zéro. Il suffirait pour ce faire, dans le bloc catch, mais ce serait mauvais style.

l'appel à GetFiles(Dir) redimensionne le tableau.

string[] foundFiles= new string[0];
string dir = @"c:\";
try
{
    foundFiles = Directory.GetFiles(dir);  // Remark; Array is resized from length zero
}
// Please add appropriate Exception handling yourself
catch (IOException)
{
  Console.WriteLine("Log: Warning! IOException while reading directory: " + dir);
  // throw; // This would throw Exception to caller and avoid compiler error
}

foreach (string filename in foundFiles)
    Console.WriteLine("Filename: " + filename);
0
répondu Philm 2017-05-07 14:09:34