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?
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.
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.
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 = newstring[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.
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!");
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.
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 = newint[n,n];
List<int[]> myInts = new List<int[]>();
powinno działać."Arrays must be assigned a length"
- wstatic
metodzie spoza programuMain()
, złożyłem deklaracjęString[] tokens = null
i nie zainicjowałem jej, ale jak mogłem ją wywołać"Hello.World".Split('.')
bezSystem.NullReferenceException
błędu?Służy
List<>
do tworzenia „tablicy” o nieznanej długości.Służy
List<>.ToArray()
do zwracania rzeczywistej tablicy, a nie plikuList
.var list = new List<int>(); list.Add(1); list.Add(2); list.Add(3); var array = list.ToArray();
źródło
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 aList
jest on dodawany do tablicy. PoczątkowoList
zaczyna się od tablicy, która moim zdaniem ma długość 16. Kiedy próbujesz dodać 17. pozycję doList
, 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 gdyList
zewnę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.źródło
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
.źródło
string[] words = new string(',', size - 1).Split(',');
teraz, są inicjalizowane za pomocą""
.Użyj
ArrayList
if w .NET 1.x lub a,List<yourtype>
jeśli w .NET 2.0 lub 3.x.Szukaj ich w
System.Collections
iSystem.Collections.Generics
.źródło
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.
źródło
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!");
źródło
wypróbuj listę ogólną zamiast tablicy
źródło
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ę :)
źródło
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.
źródło
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];
źródło