2013-02-17 31 views
12

W języku Java istnieje około 18 statycznych metod "wypełniania" w tablicach klas, które służą do przypisania jednej wartości do każdego elementu w tablicy. Szukam odpowiednika w C#, aby osiągnąć to samo, ale nie znajduję nic z taką samą zwartość:wypełnij tablicę w C#

1) ForEach jak rozumiem przekazuje elementy w tablicy według wartości, więc nie mogę ich zmienić

2) Powtórz z przeliczalny tworzy nową tablicę, to wydaje się być na górze, aby utworzyć nową tablicę i skopiuj każdy element z tablicy

3) do pętli nie jest ładna, który myślę, Dlatego ludzie Java wprowadził ten kompaktowy notacji zacząć

4) wolna od metody klasy Array można ustawić wszystko do zera, ale jak mogę przekonwertować zero na niezerową wartość, jakiej chcę?

Aby zademonstrować składni Javy rozważyć ten kod, który drukuje trzy razy numer 7:

int[] iii = {1, 2, 3}; 
Arrays.fill(iii, 7); 
for (int i : iii) { 
    System.out.println(i); 
} 
+2

dodaj przykład Java, może to ja rozumiem, co chcesz – bas

+0

nie wiem Java 18 metod. opublikuj przykład. –

+0

Dlaczego komplikować, gdy nie ma potrzeby komplikować .. –

Odpowiedz

13

Napisz sobie metodę rozszerzenia

public static class ArrayExtensions { 
    public static void Fill<T>(this T[] originalArray, T with) { 
     for(int i = 0; i < originalArray.Length; i++){ 
      originalArray[i] = with; 
     } 
    } 
} 

i używać go jak

int foo[] = new int[]{0,0,0,0,0}; 
foo.Fill(13); 

wypełni wszystkie elementy z 13

+1

brad Myślę, że odpowiedziałeś około dwie minuty przed innymi rozwiązaniami. Przepraszamy również za opublikowanie duplikatu, ale nie znalazłem odpowiedzi podczas korzystania z tego wyszukiwania. Wygląda na to, że naprawdę nie ma wbudowanego zamiennika i pisanie własnych api jest drogą do zrobienia. – Mishax

+0

Większość deweloperów prowadzi bibliotekę metod rozszerzenia do IEnunerable pod ręką i dodaje do niej, gdy zajdzie taka potrzeba. To dobry nawyk, żeby się dostać. – bradgonesurfing

6

można spróbować coś takiego:

Mam initialzed tablicę za posiadające wartość 5, można umieścić Twój numer podobnie.

int[] arr = new int[10]; // your initial array 

arr = arr.Select(i => 5).ToArray(); // array initialized to 5. 
2

można napisać metodę rozszerzenia

public static void Fill<T>(this T[] array, T value) 
{ 
    for(int i = 0; i < array.Length; i++) 
    { 
    array[i] = value; 
    } 
} 
+0

Kopiowanie wklejania poprzedniej odpowiedzi nie jest takie fajne ;-) – bradgonesurfing

+0

Nie skopiowałem nikomu odpowiedzi. – WannaCSharp

0
public static void Fill<T>(this IList<T> col, T value, int fromIndex, int toIndex) 
{ 
    if (fromIndex > toIndex) 
     throw new ArgumentOutOfRangeException("fromIndex"); 

    for (var i = fromIndex; i <= toIndex; i++) 
     col[i] = value; 
} 

Coś, co działa dla wszystkich IList<T> s.

+0

OP ma tablicę – bas

+0

'IList ' jest nadal 'T []' – nawfal

2

Powiedzmy, że chcesz, aby wypełnić z numerem 13.

int[] myarr = Enumerable.Range(0, 10).Select(n => 13).ToArray();

lub

List<int> myarr = Enumerable.Range(0,10).Select(n => 13).ToList();

jeśli wolisz listę.

+0

czy to nie tworzy nowej tablicy? Arrays.fill() nie robi tego w Javie, modyfikuje istniejący. – Mishax

+0

Ponieważ pytanie dotyczyło wypełniania tablicy stałą wartością (tj. Tylko dla inicjalizacji), założyłem, że tworzyłeś tablicę właśnie tam i wtedy. Próbowałem więc podać krótką odpowiedź. Jeśli twoja tablica istniała już wcześniej, użyłbym metody Select w odpowiedzi Igoya. – roadrunner66

+0

Podoba mi się ta odpowiedź, ponieważ daje mi możliwość wyboru zakresu indeksów, w którym stała będzie wstrzykiwana. +1! –

28
int[] arr = Enumerable.Repeat(42, 10000).ToArray(); 

wierzę, że to nie praca :)

+0

Byłem świadom tej metody, o której wspomniałem w OP, szukałem czegoś, co zmodyfikowało istniejącą macierz. – Mishax