2009-03-01 12 views
65

Ich habe gerade angefangen zu lernen C# und in der Einführung zu Arrays zeigten sie, wie man eine Variable als ein Array zu etablieren, aber scheint, dass man die Länge des Arrays bei der Zuweisung angeben muss, so was wenn ich die Länge des Arrays nicht kenne?Array einer unbekannten Länge in C#

Antwort

96

Arrays müssen eine Länge zugewiesen werden. Verwenden Sie die Klasse List, um eine beliebige Anzahl von Elementen zuzulassen.

Zum Beispiel:

List<int> myInts = new List<int>(); 
myInts.Add(5); 
myInts.Add(10); 
myInts.Add(11); 
myInts.Count // = 3 
+2

Was ist, wenn zwei Dimensional? –

+1

'Liste myInts = neue Liste ();' könnte funktionieren. –

+0

Wenn Arrays eine Länge zugewiesen werden müssen, warum kann ich dies tun: String [] arr = "test; die; Werte; jetzt" .Split (';'); und es bestimmt nur die Länge? Und dennoch kann ich nicht dieselbe Codezeile verwenden und die Variablendeklaration in eine andere Zeile verschieben. –

1
var yummy = new List<string>(); 
while(person.FeelsHappy()) { 
    yummy.Add(person.GetNewFavoriteFood()); 
} 
Console.WriteLine("Sweet! I have a list of size {0}.", list.Count); 
Console.WriteLine("I didn't even need to know how big to make it " + 
    "until I finished making it!"); 
12

Sie einen Array mit der Größe zu einer Variable erstellen, dh

int size = 50; 
string[] words = new string[size]; // contains 50 strings 

kann jedoch die Größe später nicht mehr geändert werden, wenn Sie entscheiden, dass Sie 100 Wörter benötigen. Wenn Sie die Größe benötigen, um wirklich dynamisch zu sein, müssen Sie eine andere Art von Datenstruktur verwenden. Versuchen Sie List.

+0

Diese sind alle null. Versuchen Sie 'string [] words = new string (',', size - 1) .Split (',');' Jetzt werden sie mit '" "' initialisiert. – Bitterblue

2

Verwenden Sie in .NET 1.x eine ArrayList oder in .NET 2.0 oder 3.x eine List<yourtype>.

Suchen Sie nach ihnen in System.Collections und System.Collections.Generics.

29

Verwenden Sie List<>, um ein "Array" unbekannter Länge aufzubauen.

Verwenden Sie List<>.ToArray(), um ein reales Array zurückzugeben, und nicht List.

var list = new List<int>(); 
list.Add(1); 
list.Add(2); 
list.Add(3); 
var array = list.ToArray(); 
+0

Für mich löste die Liste das Problem der unbekannten Größe, und dann. ToArray() erstellte das Array, das ich brauchte. – dev1998

+1

mit System.Collections.Generic; – Hariboo

1

versuchen, eine generische Liste anstelle von Array

2

Sie auch in Dictionarys sehen möchten, wenn Ihre Daten eindeutig zuzuordnen sind, mit Dadurch erhalten Sie zwei Spalten zu arbeiten.

Benutzername, Gesamt Rechnung

es Ihnen in Tool viel gebaut gibt nur den Wert zu suchen und zu aktualisieren.

1

Kurz zusammengefasst verwenden Sie bitte Collections and Generics.

Es ist ein Muss für jeden C# -Entwickler, es lohnt Zeit verbringen :)

11

Ein wenig Hintergrundinformationen zu lernen:

Wie gesagt, wenn Sie eine dynamische Sammlung von Dingen haben wollen, verwenden Sie einen List<T> . Intern verwendet eine Liste auch ein Array für den Speicher. Dieses Array hat genau wie jedes andere Array eine feste Größe. Sobald ein Array mit einer Größe deklariert ist, ändert es sich nicht. Wenn Sie ein Element zu einem List hinzufügen, wird es dem Array hinzugefügt. Anfangs beginnt die List mit einem Array, von dem ich glaube, dass es eine Länge von 16 hat. Wenn Sie versuchen, das 17. Element zu List hinzuzufügen, was passiert ist, dass ein neues Array zugewiesen wird, das ist (denke ich) doppelt so groß wie das alt, also 32 Artikel. Dann wird der Inhalt des alten Arrays in das neue Array kopiert. Während also ein List dem Außenbeobachter dynamisch erscheinen mag, muss er intern auch den Regeln entsprechen.

Und wie Sie vielleicht geraten haben, ist das Kopieren und Zuweisen der Arrays nicht frei, so sollte man möglichst wenige davon haben und das können Sie (im Konstruktor List) eine Initiale angeben Größe des Arrays, das in einem perfekten Szenario gerade groß genug ist, um alles, was Sie wollen, zu halten. Dies ist jedoch eine Mikro-Optimierung und es ist unwahrscheinlich, dass es Ihnen jemals etwas ausmachen wird, aber es ist immer schön zu wissen, was Sie sind eigentlich tun.

+0

Dies ist genau die Information, die ich suchte. Genau richtig und viel informativer als die meisten anderen Antworten. +1 –

1

Wie oben ausgeführt, ist die generische Liste <> der beste Weg, dies zu tun.

Wenn Sie in .NET 1. * stecken, müssen Sie stattdessen die ArrayList-Klasse verwenden. Dies hat keine Überprüfung der Kompilierungszeit und Sie müssen auch Casting hinzufügen - unordentlich.

Nachfolgende Versionen haben auch verschiedene Varianten implementiert - einschließlich Thread-sichere Varianten.