Array unbekannter Länge in C #

80

Ich habe gerade angefangen, C # zu lernen, und in der Einführung zu Arrays haben sie gezeigt, wie man eine Variable als Array erstellt, aber es scheint, dass man die Länge des Arrays bei der Zuweisung angeben muss. Was ist, wenn ich die Länge des Arrays nicht kenne? Array?

UnkwnTech
quelle

Antworten:

114

Arrays müssen eine Länge zugewiesen werden. Verwenden Sie die ListKlasse , 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
Samuel
quelle
4
Was ist, wenn zweidimensional?
Subin Jacob
3
List<int[]> myInts = new List<int[]>();könnte klappen.
Nicolas Tyler
1
Wenn Arrays eine Länge zugewiesen werden muss, warum kann ich das dann tun: String [] arr = "test; the; values; now" .Split (';'); und es bestimmt nur die Länge? Und doch kann ich nicht dieselbe Codezeile nehmen und die Variablendeklaration in eine andere Zeile verschieben.
Matthew_360
@ matthew_360 Innerhalb der Split-Funktion wird das Array tatsächlich mit einer festen Größe aufgerufen. Beispiel: referencesource.microsoft.com/#mscorlib/system/…
Hutch
In Bezug auf Ihre Antwort "Arrays must be assigned a length"- bei einer staticMethode außerhalb von habe Main()ich die Deklaration abgegeben String[] tokens = nullund sie nicht initialisiert, aber warum konnte ich "Hello.World".Split('.')sie ohne System.NullReferenceExceptionFehler aufrufen ?
Minh Tran
39

Verwenden Sie List<>diese Option , um ein 'Array' unbekannter Länge aufzubauen.

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

var list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
var array = list.ToArray();
TFD
quelle
Für mich löste die Liste das Problem der unbekannten Größe und dann erstellte .ToArray () das Array, das ich brauchte.
dev1998
2
using System.Collections.Generic;
PodTech.io
17

Ein paar Hintergrundinformationen:

Wie gesagt, wenn Sie eine dynamische Sammlung von Dingen haben möchten, verwenden Sie a List<T>. Intern verwendet eine Liste auch ein Array zur Speicherung. Dieses Array hat wie jedes andere Array eine feste Größe. Sobald ein Array mit einer Größe deklariert wurde, ändert es sich nicht mehr. Wenn Sie ein Element zu einem hinzufügen List, wird es dem Array hinzugefügt. Anfänglich Listbeginnt das mit einem Array, von dem ich glaube, dass es eine Länge von 16 hat. Wenn Sie versuchen, das 17. Element zum ListArray hinzuzufügen , wird ein neues Array zugewiesen, das (glaube ich) doppelt so groß ist wie das alte , also 32 Artikel. Dann wird der Inhalt des alten Arrays in das neue Array kopiert. Während a Listfür den externen Beobachter dynamisch erscheint, muss es auch intern den Regeln entsprechen.

Und wie Sie vielleicht vermutet haben, ist das Kopieren und Zuweisen der Arrays nicht kostenlos, daher sollte man versuchen, so wenig wie möglich davon zu haben, und dazu können Sie (im Konstruktor von List) eine Anfangsgröße des Arrays angeben. Das ist in einem perfekten Szenario gerade groß genug, um alles aufzunehmen, was Sie wollen. Dies ist jedoch eine Mikrooptimierung und es ist unwahrscheinlich, dass es Ihnen jemals etwas ausmacht, aber es ist immer schön zu wissen, was Sie tatsächlich tun.

JulianR
quelle
Dies ist genau die Information, nach der ich gesucht habe. Genau richtig und viel informativer als die meisten anderen Antworten. +1
Carrie Kendall
16

Sie können ein Array mit der Größe einer Variablen erstellen, d. H.

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

Diese Größe kann sich jedoch später nicht ändern, wenn Sie 100 Wörter benötigen. Wenn die Größe wirklich dynamisch sein soll, müssen Sie eine andere Art von Datenstruktur verwenden. Versuchen Sie es List.

mqp
quelle
Diese sind alle null. Versuchen string[] words = new string(',', size - 1).Split(',');Sie es jetzt mit "".
Bitterblue
3

Verwenden Sie ein ArrayListif in .NET 1.x oder ein List<yourtype>if in .NET 2.0 oder 3.x.

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

Diego Jancic
quelle
2

Möglicherweise möchten Sie auch in Wörterbücher schauen, wenn Ihre Daten eindeutig sind. Dadurch erhalten Sie zwei Spalten, mit denen Sie arbeiten können.

Benutzername, Gesamtrechnung

Es gibt Ihnen viele integrierte Tools, mit denen Sie nur den Wert suchen und aktualisieren können.

Crash893
quelle
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!");
Yfeldblum
quelle
1

Versuchen Sie eine generische Liste anstelle eines Arrays

Hannoun Yassir
quelle
1

Kurz gesagt, verwenden Sie bitte Sammlungen und Generika.

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

Anfänger
quelle
1

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

Wenn Sie in .NET 1. * stecken bleiben, müssen Sie stattdessen die ArrayList-Klasse verwenden. Dies hat keine Typprüfung zur Kompilierungszeit und Sie müssen auch Casting hinzufügen - chaotisch.

Aufeinanderfolgende Versionen haben auch verschiedene Variationen implementiert - einschließlich thread-sicherer Varianten.

winwaed
quelle
1

Wenn Sie wirklich ein Array anstelle einer Liste verwenden müssen, können Sie ein Array erstellen, dessen Größe zur Laufzeit wie folgt berechnet wird ...

zB möchte ich ein zweidimensionales Array der Größe n mal n. n wird zur Laufzeit vom Benutzer abgerufen

int n = 0;
bool isInteger = int.TryPase(Console.ReadLine(), out n);
var x = new int[n,n];
Ken Janka
quelle
In ähnlicher Weise schreibe ich für ein eindimensionales Array: var x = new int [n];
Ken Janka