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?
80
List<int[]> myInts = new List<int[]>();
könnte klappen."Arrays must be assigned a length"
- bei einerstatic
Methode außerhalb von habeMain()
ich die Deklaration abgegebenString[] tokens = null
und sie nicht initialisiert, aber warum konnte ich"Hello.World".Split('.')
sie ohneSystem.NullReferenceException
Fehler aufrufen ?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 aList
.var list = new List<int>(); list.Add(1); list.Add(2); list.Add(3); var array = list.ToArray();
quelle
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ügenList
, wird es dem Array hinzugefügt. AnfänglichList
beginnt das mit einem Array, von dem ich glaube, dass es eine Länge von 16 hat. Wenn Sie versuchen, das 17. Element zumList
Array 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 aList
fü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.quelle
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
.quelle
string[] words = new string(',', size - 1).Split(',');
Sie es jetzt mit""
.Verwenden Sie ein
ArrayList
if in .NET 1.x oder einList<yourtype>
if in .NET 2.0 oder 3.x.Suchen Sie nach ihnen in
System.Collections
undSystem.Collections.Generics
.quelle
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.
quelle
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!");
quelle
Versuchen Sie eine generische Liste anstelle eines Arrays
quelle
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 :)
quelle
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.
quelle
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];
quelle