it-swarm.com.de

Wie initialisiere ich ein leeres Array in C #?

Kann ein leeres Array ohne Angabe der Größe erstellt werden?

Zum Beispiel habe ich erstellt:

String[] a = new String[5];

Können wir das obige String-Array ohne die Größe erstellen?

249
yogesh

Wenn Sie eine Sammlung verwenden, deren Größe Sie im Voraus nicht kennen, gibt es bessere Optionen als Arrays.

Verwenden Sie stattdessen einen List<string> - Sie können so viele Elemente hinzufügen, wie Sie benötigen. Wenn Sie ein Array zurückgeben müssen, rufen Sie ToArray() für die Variable auf.

var listOfStrings = new List<string>();

// do stuff...

string[] arrayOfStrings = listOfStrings.ToArray();

Wenn Sie müssen ein leeres Array erstellen, können Sie Folgendes tun:

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

Versuche dies: 

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

In .Net 4.6 ist die bevorzugte Methode die Verwendung einer neuen Methode, Array.Empty :

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

Die Implementierung ist knapp und verwendet wie statische Member in generischen Klassen sich in .Net verhalten:

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-Vertrag Code zur besseren Übersichtlichkeit entfernt)

Siehe auch:

74
Kobi

Sie können es mit einer Größe von 0 initialisieren, aber Sie müssen es erneut initialisieren, wenn Sie die Größe kennen, da Sie nicht an das Array anhängen können.

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

Es ist nicht viel Sinn, ein Array ohne Größe zu deklarieren. Ein Array hat ungefähr Größe. Wenn Sie ein Array mit einer bestimmten Größe deklarieren, geben Sie die festgelegte Anzahl von Slots an, die in einer Objektgruppe verfügbar sind und die Speicher enthalten können. Entsprechend wird Speicher zugewiesen. Um etwas hinzuzufügen, müssen Sie das vorhandene Array trotzdem neu initialisieren (selbst wenn Sie die Größe des Arrays ändern, siehe diesen Thread ). In einem der seltenen Fälle, in denen Sie ein leeres Array initialisieren möchten, können Sie das Array als Argument übergeben.

Wenn Sie eine Sammlung definieren möchten, wenn Sie nicht wissen, in welcher Größe sie möglicherweise liegt, ist Array nicht Ihre Wahl, sondern etwas wie ein List<T> oder ähnliches.

Das heißt, die einzige Möglichkeit, ein Array ohne Angabe der Größe zu deklarieren, ist ein leeres Array mit size 0. hemant und Alex Dn bietet zwei Möglichkeiten. Eine einfachere Alternative ist nur:

string[] a = { };

[Die Elemente innerhalb der Klammer sollten implizit in einen Typ konvertiert werden können, z. B. string[] a = { "a", "b" };]

Oder noch ein anderes:

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

Hier ist ein deklarativer Weg:

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

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

Jetzt können Sie anrufen:

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

//or

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

Du kannst tun:

string[] a = { String.Empty };

Hinweis: OP bedeutet, dass Sie keine Größe angeben müssen, kein Array erstellen sizeless

3
vapcguy

Sie können die Array-Größe zur Laufzeit definieren .

Auf diese Weise können Sie die Größe des Arrays dynamisch berechnen. Einmal definiert, ist die Größe jedoch unveränderlich.

Array a = Array.CreateInstance(typeof(string), 5);
2
radarbob

Ich hatte versucht:

string[] sample = new string[0];

Aber ich konnte nur eine Zeichenfolge einfügen, und dann bekam ich einen exceptionOutOfBound-Fehler, also habe ich einfach eine Größe dafür gesetzt

string[] sample = new string[100];

Oder auf eine andere Weise, die für mich funktioniert:

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

Wert für Liste zuweisen:

sample.Add(your input);
2
Cs_Lu

Einfach und elegant!

string[] array = {}
1
disklosr

Wie ich weiß, können Sie kein Array ohne Größe erstellen, aber Sie können verwenden 

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

und dann l.ToArray().

1
Alex Dn

@Nawfal & @Kobi-Vorschläge kombinieren:

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

Anwendungsbeispiel:

Array<string>.Empty

HTH

0
ShloEmi

Hier ist ein reales Beispiel. Dabei ist es notwendig, das Array foundFiles zunächst auf Null zu initialisieren.

(Wie in anderen Antworten hervorgehoben: Dies initialisiert kein Element und insbesondere kein Element mit dem Index Null, da dies bedeuten würde, dass das Array die Länge 1 hat. Das Array hat nach dieser Zeile eine Länge von Null!).

Wenn der Teil = string[0] weggelassen wird, liegt ein Compiler-Fehler vor!

Dies ist wegen des Fangblocks ohne Wiederauswurf. Der C # -Compiler erkennt den Codepfad, durch den die Funktion Directory.GetFiles() eine Exception auslösen kann, sodass das Array möglicherweise nicht initialisiert wird.

Bevor jemand sagt, dass das Zurücksetzten der Ausnahme nicht die fehlerhafte Fehlerbehandlung wäre: Dies trifft nicht zu. Fehlerbehandlung muss den Anforderungen entsprechen.

In diesem Fall wird davon ausgegangen, dass das Programm im Falle eines Verzeichnisses fortgesetzt werden soll, das nicht gelesen werden kann, und nicht Break. Das beste Beispiel ist eine Funktion, die eine Verzeichnisstruktur durchläuft. Hier protokolliert die Fehlerbehandlung es nur. Natürlich könnte dies besser gemacht werden, z. Sammeln aller Verzeichnisse mit fehlgeschlagenen GetFiles(Dir)-Aufrufen in einer Liste, dies wird jedoch hier zu weit führen.

Es genügt zu sagen, dass das Vermeiden von throw ein gültiges Szenario ist, und das Array muss daher auf Länge Null initialisiert werden. Es wäre genug, um dies im catch-Block zu tun, aber das wäre ein schlechter Stil.

Der Aufruf von GetFiles(Dir) ändert die Größe des Arrays.

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