2012-05-21 10 views
29

Chciałbym utworzyć int[] o długości X i cenią go [0,1,2 .... X]Tworzenie C# int [] o wartości co 0,1,2,3 ... długości

np

public int[] CreateAA(int X){}

int[] AA = CreateAA(9) => [0,1,2,3,4,5,6,7,8,9]

jest jakiś prosty sposób? Lub trzeba pętli i wartość init

+0

Możliwa duplikat [Jak utworzyć tablicę z sekwencji liczb całkowitych w C#?] (Http://stackoverflow.com/questions/4588787/how-to-create-array -z-sekwencją-liczb całkowitych-w-c) –

Odpowiedz

57

Możesz skorzystać z funkcjonalności IEnumerable.

int[] arr = Enumerable.Range(0, X+1).ToArray(); 

To stworzy IEnumerable List dla Ciebie i .ToArray() zaspokoić potrzebę int array.

Więc dla X = 9 w Twoim przypadku byłoby wygenerować tablicę dla [0,1,2,3,4,5,6,7,8,9] (jak trzeba)

4

Po co funkcja, gdy jest już tam.

W tym konkretnym przykładzie, należy

int[] AA = Enumerable.Range(0, 10).ToArray(); 

gdzie 0 is the starting value i 10 (X + 1) is the length of array

Więc ogólnie jeden zastosowanie do wszystkich

int[] AA = Enumerable.Range(0, X + 1).ToArray(); 
+0

Powinno to być "Enumerable.Range (0, X + 1)", ponieważ drugim parametrem jest "Count" –

+0

Uwaga: Jeśli 'X' to' 9', to należy użyć 'Enumerable.Range (0, X + 1)', aby uzyskać liczby od 0 do 9. – Guffa

+1

Błąd nieprawidłowej kompilacji, zwraca iEnumerable nie tablicę – V4Vendetta

2

z funkcji i pętli:

static int[] f(int X) 
{ 
    int[] a = new int[X+1]; 
    for(int i = 0; i < a.Length; i++) 
     a[i] = i; 
    return a; 
} 
+1

więcej zoptymalizowanych odpowiedzi są zamieszczone powyżej. – vaibhav

+3

@vaibhav Bardziej zwięzłe odpowiedzi na pewno za pomocą 'Enumerable.Range'. Czy z konieczności będzie to bardziej zoptymalizowane? Powiedział, że ten kod nie kompiluje. –

+0

cóż, to zależy od użycia kodu, sir – vaibhav

1

pod względem kompletności, tutaj jest to funkcja, która stwarza obraz szyk.

Uczyniłem to trochę bardziej wszechstronnym dzięki parametrom dla wartości min i max, tj. CreateArray(0, 9) zwraca {0,1,2,3,4,5,6,7,8,9}.

static int[] CreateArray(int min, int max) { 
    int[] a = new int[max - min + 1]; 
    for (int i = 0; i < a.Length; i++) { 
    a[i] = min + i; 
    } 
    return a; 
} 
6

Korzystanie Enumerable.Range(0, 10).ToArray() jest bardzo zwięzły, ale jeśli chcesz stworzyć bardzo duży wachlarz metoda ToArray rozszerzenie będzie musiał zbierać numery do bufora, które będą musiały zostać przesunięte wielokrotnie. Przy każdej realokacji zawartość bufora jest kopiowana do nowego większego bufora. .NET używa strategii, w której rozmiar bufora jest podwojony przy każdej realokacji (a bufor początkowy ma cztery pozycje).

Więc jeśli chcesz uniknąć wielu realokacje bufora trzeba utworzyć tablicę z góry:

int[] aa = new int[10]; 
for (var i = 0; i < aa.Length; i += 1) 
    aa[i] = i; 

Jest to najbardziej skuteczny sposób inicjowania tablicy.

Jeśli jednak potrzebujesz tablicy o wartości 100 000 000 kolejnych liczb, powinieneś spojrzeć na projekt, w którym nie musisz przechowywać wszystkich liczb w tablicy, aby uniknąć wpływu wymogu pamięci. IEnumerable<int> jest bardzo przydatny do tego celu, ponieważ nie trzeba przydzielać całej sekwencji, ale można ją wygenerować podczas iteracji, i to jest dokładnie to, co robi Enumerable.Range. Zatem unikanie szeregu kolejnych liczb w pierwszej kolejności może być nawet lepsze niż myślenie o tym, jak je utworzyć.

1

Aby zainicjować spróbować tej

int x = 10; 
Enumerable.Range(0, x) 
      .Select((v, i) => v + i).ToArray(); 
Powiązane problemy