web-dev-qa-db-fra.com

Comment initialiser un tableau vide en 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 chaînes ci-dessus sans la taille?

249
yogesh

Si vous envisagez d'utiliser une collection dont vous ne connaissez pas la taille à l'avance, il existe de meilleures options que les tableaux.

Utilisez plutôt un List<string> - cela vous permettra d'ajouter autant d'éléments que nécessaire et si vous devez renvoyer 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 le faire:

string[] emptyStringArray = new string[0]; 
352
Oded

Essaye ça: 

string[] a= new string[] { };
147
hemant

Dans .Net 4.6, la méthode recommandée consiste à utiliser une nouvelle méthode, Array.Empty :

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

La implémentation est succincte, en utilisant comment les membres statiques des classes génériques se comportent en .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];
}

(code lié au contrat supprimé pour plus de clarté)

Voir également:

74
Kobi

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

string[] a = new string[0];
28
MatthiasG

Il est inutile de déclarer un tableau sans taille. Un tableau de taille approximative _. Lorsque vous déclarez un tableau de taille spécifique, vous spécifiez le nombre fixe d'emplacements disponibles dans une collection pouvant contenir des objets et, par conséquent, la mémoire est allouée. Pour ajouter quelque chose, vous devez quand même réinitialiser le tableau existant (même si vous redimensionnez le tableau, voir ce fil ). Un des rares cas où vous voudriez initialiser un tableau vide serait de passer tableau en argument.

Si vous souhaitez définir une collection alors que vous ne savez pas de quelle taille il peut éventuellement s'agir, array n'est pas votre choix, mais quelque chose comme un List<T> ou similaire.

Cela dit, le seul moyen de déclarer un tableau sans spécifier de taille est d’avoir un tableau vide de size 0. hemant et Alex Dn propose deux méthodes. Une autre alternative plus simple consiste à simplement:

string[] a = { };

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

Ou encore un autre:

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

Voici une manière 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 appeler:

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

//or

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

Tu peux faire:

string[] a = { String.Empty };

Note: OP signifiait ne pas avoir à spécifier une taille, pas à faire un tableau sans taille

3
vapcguy

Vous pouvez définir la taille du tableau au moment de 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
radarbob

J'avais essayé:

string[] sample = new string[0];

Mais je ne pouvais insérer qu'une chaîne dans celui-ci, puis j'ai eu une erreur exceptionOutOfBound, alors j'ai simplement mis une taille, comme

string[] sample = new string[100];

Ou une autre façon qui fonctionne pour moi:

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

Attribuer une valeur à la liste:

sample.Add(your input);
2
Cs_Lu

Simple et élégant!

string[] array = {}
1
disklosr

Comme je sais que vous ne pouvez pas faire de tableau sans taille, mais vous pouvez utiliser 

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

et ensuite l.ToArray().

1
Alex Dn

Combinaison des suggestions @nawfal et @Kobi:

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
ShloEmi

Voici un exemple du monde réel. Pour cela, il est nécessaire d’initialiser le tableau foundFiles en premier à la longueur zéro.

(Comme souligné dans d'autres réponses: Ceci initialise pas un élément et surtout pas un élément d'indice zéro car cela voudrait dire que le tableau avait une longueur de 1. Le tableau a une longueur de zéro après cette ligne!).

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

Ceci est dû au blocage du bloc sans relance. Le compilateur C # reconnaît le chemin du code et indique que la fonction Directory.GetFiles() peut générer une exception, de sorte que le tableau puisse être non initialisé.

Avant que quiconque ne dise, ne pas renvoyer l'exception serait une mauvaise gestion des erreurs: ce n'est pas vrai. La gestion des erreurs doit correspondre aux exigences.

Dans ce cas, il est supposé que le programme doit continuer dans le cas d'un répertoire qui ne peut pas être lu et ne pas rompre. Le meilleur exemple est une fonction traversant une structure de répertoires. Ici, la gestion des erreurs ne fait que la consigner. Bien sûr, cela pourrait être mieux fait, par exemple rassembler tous les répertoires avec des appels GetFiles(Dir) ayant échoué dans une liste, mais cela mènera trop loin ici.

Il suffit d'indiquer que le fait d'éviter throw est un scénario valide. Le tableau doit donc être initialisé à la longueur zéro. Ce serait suffisant pour faire cela dans le bloc, mais ce serait un 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
Philm