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?

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

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();

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.


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.


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.


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.


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!");


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ę :)


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.


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

podobnie dla tablicy jednowymiarowej napiszę: var x = new int [n];
Ken Janka,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.