2013-02-17 15 views
12

In Java ci sono circa 18 metodi di "riempimento" statici negli array di classe che servono per assegnare un valore a ciascun elemento in un array. Sto cercando un equivalente in C# per ottenere la stessa cosa, ma non trovo nulla con la stessa compattezza:riempire un array in C#

1) ForEach as I capisce che passa gli elementi dell'array in base al valore, quindi non posso cambiarli

2) Ripetere da Enumerable crea un nuovo array, sembra di essere in testa di creare un nuovo array e quindi copiare ogni elemento dalla matrice

3) un ciclo for non è abbastanza, che immagino Ecco perché la gente di Java ha introdotto questa notazione compatta per iniziare con

4) Il metodo Clear dalla classe Array può impostare tutto a zero, ma come posso convertire lo zero nel valore diverso da zero che voglio?

Per dimostrare la sintassi di Java considerare questo codice che stampa tre volte il numero 7:

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

inviare un esempio Java, forse allora ho capito quello che vuoi – bas

+0

Non so 18 metodi di Java. pubblica un esempio –

+0

perché complicare quando non c'è alcuna necessità di complicare .. –

risposta

13

Scrivi anche tu una metodo di estensione

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

e utilizzarlo come

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

riempirà tutti gli elementi con 13

+1

brad Penso che tu abbia risposto circa due minuti prima delle altre soluzioni. Scusate anche per aver postato un duplicato ma non ho trovato la risposta durante l'utilizzo della ricerca. Sembra che non ci sia davvero una sostituzione incorporata e scrivere la propria API è la strada da percorrere. – Mishax

+0

La maggior parte degli sviluppatori tiene a portata di mano una libreria di metodi di estensione a IEnunerable e la aggiunge a seconda delle necessità. È una buona abitudine entrare. – bradgonesurfing

6

si potrebbe provare qualcosa di simile:

ho initialzed l'array per avere il valore 5, si potrebbe mettere il tuo numero allo stesso modo.

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

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

si potrebbe scrivere un metodo di estensione

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

Copia incollare una risposta precedente non è così bello ;-) – bradgonesurfing

+0

Non ho copiato incollare la risposta di nessuno. – 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; 
} 

Qualcosa che funzioni per tutti IList<T> s.

+0

OP ha un array – bas

+0

'IList ' è ancora 'T []' – nawfal

2

dici che si desidera riempire con il numero 13.

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

o

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

, se si preferisce una lista.

+0

non sta creando un nuovo array? Arrays.fill() non lo sta facendo in Java, sta modificando uno esistente. – Mishax

+0

Dato che la domanda riguardava il riempimento di un array con un valore costante (vale a dire solo per l'inizializzazione), supponevo che stessimo creando l'array proprio lì e poi. Così ho provato a fornire una risposta breve. Se il tuo array esisteva già prima, userei il metodo Select nella risposta di Igoy. – roadrunner66

+0

Mi piace questa risposta poiché mi dà l'opportunità di scegliere l'intervallo di indice in cui verrà iniettata la costante. +1! –

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

Credo che questo fa il lavoro :)

+0

Ero a conoscenza di questo metodo, come ho detto nell'OP, stavo cercando qualcosa che modificasse un array esistente. – Mishax