2012-05-22 23 views
12

Edit: Ho provato il metodo Take/Skip ma ottengo il seguente errore:Dividere un array in 2 array C#

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<string>' to 
'string[]'. An explicit conversion exists (are you missing a cast?) 

non so quello che sto facendo male perché ho copiato Saeed di codice.

Ho un array di stringhe (contenente ovunque da 20 a 300 elementi) e voglio dividerlo in 2 array separati, dal centro del primo.

So come posso farlo utilizzando un ciclo for, ma mi piacerebbe sapere se c'era un modo più veloce/migliore di farlo. Ho anche bisogno di essere in grado di dividere correttamente una matrice anche se ha un numero dispari di elementi, ad esempio:

string[] words = {"apple", "orange", "banana", "pear", "lemon"}; 
string[] firstarray, secondarray; 
SplitArray(words, out firstarray, out secondarray); // Or some other function 
// firstarray has the first 3 of the items from words, 'apple', 'orange' and 'banana' 
// secondarray has the other 2, 'pear' and 'lemon' 
+0

Al fine di risolvere il problema fuso aggiungere '.ToArray()' dopo il prendere e saltare metodi –

risposta

38

È possibile utilizzare LINQ:

firstArray = array.Take(array.Length/2).ToArray(); 
secondArray = array.Skip(array.Length/2).ToArray(); 

Perché questo funziona, nonostante la parità di la dimensione dell'array originale?

Il primo array prende gli elementi array.Length/2 e il secondo salta i primi elementi array.Length/2, significa che non c'è alcun conflitto tra questi due array. Naturalmente se il numero di elementi è dispari non possiamo dividere l'array in due parti di uguale dimensione.

Se si desidera avere più elementi nella prima metà (nel caso dispari), fare questo:

firstArray = array.Take((array.Length + 1)/2).ToArray(); 
secondArray = array.Skip((array.Length + 1)/2).ToArray(); 
+0

Grazie, lo proverò presto ma questo gestirà correttamente la divisione anche se ha un numero dispari di elementi? – 3aw5TZetdf

+0

@MatthewRz, Sì funziona sempre bene. –

+0

Va bene, grazie mille! – 3aw5TZetdf

4
string[] words = {"apple", "orange", "banana", "pear", "lemon"}; 
int mid = words.Length/2; 
string[] first = words.Take(mid).ToArray(); 
string[] second = words.Skip(mid).ToArray(); 
+0

Grazie! Ci proverò presto. – 3aw5TZetdf

2
string[] words = { "apple", "orange", "banana", "pear", "lemon" }; 
var halfWay = words.Length/2; 

var firstHalf = words.Take(halfWay); 
var secondHalf = words.Skip(halfWay); 
3

Un approccio più generalizzato che dividerlo in tante parti come si specifica:

public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> list, int parts) 
     { 
      return list.Select((item, index) => new {index, item}) 
         .GroupBy(x => (x.index + 1)/(list.Count()/parts) + 1) 
         .Select(x => x.Select(y => y.item)); 
     } 

* A cura skarmats Grazie

+2

Questo cambierà l'ordine delle cose. Quindi l'ennesima matrice risultante non corrisponderà all'ennesima sezione dell'origine. – skarmats

+0

Aggiornato per impedire la striping dell'array. – Totero

4

Se non si vuole/non può usare LINQ si può semplicemente fare:

string[] words = { "apple", "orange", "banana", "pear", "lemon" }; 
    string[] firstarray, secondarray; 
    int mid = words.Length/2; 
    firstarray = new string[mid]; 
    secondarray = new string[words.Length - mid]; 
    Array.Copy(words, 0, firstarray, 0, mid); 
    Array.Copy(words, mid, secondarray, 0, secondarray.Length);