Tablica o nieznanej długości w C #

81

Właśnie zacząłem uczyć się C # i we wstępie do tablic pokazali, jak ustalić zmienną jako tablicę, ale wydaje się, że przy przypisaniu trzeba określić długość tablicy, więc co jeśli nie znam długości tablicy szyk?

UnkwnTech
źródło

Odpowiedzi:

115

Tablicom należy przypisać długość. Aby umożliwić dowolną liczbę elementów, użyj Listklasy.

Na przykład:

List<int> myInts = new List<int>();
myInts.Add(5);
myInts.Add(10);
myInts.Add(11);
myInts.Count // = 3
Samuel
źródło
3
List<int[]> myInts = new List<int[]>();powinno działać.
Nicolas Tyler
1
Jeśli tablice muszą mieć przypisaną długość, to dlaczego mam to zrobić: String [] arr = "test; the; values; now" .Split (';'); i tylko określa długość? A jednak nie mogę wziąć tej samej linii kodu i przenieść deklarację zmiennej do innej linii.
matthew_360
@ matthew_360 Wewnątrz funkcji Split tablica jest faktycznie wywoływana ze stałym rozmiarem. Przykład: referenceource.microsoft.com/#mscorlib/system/…
Hutch
Jeśli chodzi o twoją odpowiedź "Arrays must be assigned a length"- w staticmetodzie spoza programu Main(), złożyłem deklarację String[] tokens = nulli nie zainicjowałem jej, ale jak mogłem ją wywołać "Hello.World".Split('.')bez System.NullReferenceExceptionbłędu?
Minh Tran
40

Służy List<>do tworzenia „tablicy” o nieznanej długości.

Służy List<>.ToArray()do zwracania rzeczywistej tablicy, a nie pliku List.

var list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
var array = list.ToArray();
TFD
źródło
Dla mnie Lista rozwiązała problem nieznanego rozmiaru, a następnie .ToArray () utworzyła tablicę, której potrzebowałem.
dev1998
2
using System.Collections.Generic;
PodTech.io
20

Trochę informacji ogólnych:

Jak powiedziano, jeśli chcesz mieć dynamiczną kolekcję rzeczy, użyj pliku List<T>. Wewnętrznie lista używa również tablicy do przechowywania. Ta tablica ma stały rozmiar, tak jak każda inna tablica. Gdy tablica jest zadeklarowana jako posiadająca rozmiar, to się nie zmienia. Po dodaniu elementu do a Listjest on dodawany do tablicy. Początkowo Listzaczyna się od tablicy, która moim zdaniem ma długość 16. Kiedy próbujesz dodać 17. pozycję do List, co się dzieje, to przydzielana jest nowa tablica, która jest (myślę) dwukrotnie większa od starej czyli 32 pozycje. Następnie zawartość starej tablicy jest kopiowana do nowej tablicy. Tak więc, podczas gdy Listzewnętrznemu obserwatorowi może wydawać się dynamiczny, wewnętrznie musi również przestrzegać zasad.

I jak można się domyślić, kopiowanie i alokacja tablic nie jest darmowa, więc należy dążyć do ich jak najmniejszej liczby i w tym celu można określić (w konstruktorze List) początkowy rozmiar tablicy, który w idealnym scenariuszu jest wystarczająco duży, aby pomieścić wszystko, co chcesz. Jest to jednak mikro-optymalizacja i jest mało prawdopodobne, aby kiedykolwiek miała dla Ciebie znaczenie, ale zawsze dobrze jest wiedzieć, co faktycznie robisz.

JulianR
źródło
1
To jest dokładnie ta informacja, której szukałem. Wyraźne i dużo bardziej pouczające niż większość innych odpowiedzi. +1
Carrie Kendall
16

Możesz stworzyć tablicę o rozmiarze ustawionym na zmienną, tj

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

Jednak ten rozmiar nie może się później zmienić, jeśli zdecydujesz, że potrzebujesz 100 słów. Jeśli chcesz, aby rozmiar był naprawdę dynamiczny, musisz użyć innego rodzaju struktury danych. Spróbuj List.

mqp
źródło
Te wszystkie są nieważne. Wypróbuj string[] words = new string(',', size - 1).Split(',');teraz, są inicjalizowane za pomocą "".
Bitterblue
3

Użyj ArrayListif w .NET 1.x lub a, List<yourtype>jeśli w .NET 2.0 lub 3.x.

Szukaj ich w System.Collectionsi System.Collections.Generics.

Diego Jancic
źródło
2

Możesz również zajrzeć do Słowników, jeśli twoje dane są unikalne. To da ci dwie kolumny do pracy.

Nazwa użytkownika, całkowity rachunek

zapewnia wiele wbudowanych narzędzi do wyszukiwania i aktualizowania tylko wartości.

Wypadek893
źródło
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
źródło
1

wypróbuj listę ogólną zamiast tablicy

Hannoun Yassir
źródło
1

Krótko mówiąc, użyj kolekcji i typów generycznych.

To pozycja obowiązkowa dla każdego programisty C #, warto poświęcić czas na naukę :)

Nowicjusz
źródło
1

Jak opisano powyżej, najlepszym sposobem na zrobienie tego jest ogólna lista <>.

Jeśli utkniesz w .NET 1. *, będziesz musiał zamiast tego użyć klasy ArrayList. To nie ma sprawdzania typu w czasie kompilacji, a także musisz dodać rzutowanie - bałagan.

W kolejnych wersjach zaimplementowano również różne odmiany - w tym warianty bezpieczne dla wątków.

winwaed
źródło
1

Jeśli naprawdę potrzebujesz użyć tablicy zamiast listy, możesz utworzyć tablicę, której rozmiar jest obliczany w czasie wykonywania, tak jak w przypadku ...

np. chcę dwuwymiarową tablicę o rozmiarze n na n. n zostanie pobrane od użytkownika w czasie wykonywania

int n = 0;
bool isInteger = int.TryPase(Console.ReadLine(), out n);
var x = new int[n,n];
Ken Janka
źródło
podobnie dla tablicy jednowymiarowej napiszę: var x = new int [n];
Ken Janka,