2012-05-22 18 views
12

Edit: Ich habe den Take/überspringen Methode versucht, aber ich bekomme die folgende Fehlermeldung:Splitting ein Array in zwei Arrays C#

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

Ich weiß nicht, was ich falsch mache, weil ich Saeed kopiert Code.

Ich habe ein String-Array (mit irgendwo zwischen 20 und 300 Elemente) und ich möchte es in zwei separate Arrays aufteilen, von der Mitte der ersten.

Ich weiß, wie ich dies tun kann mit einer for-Schleife, aber ich würde gerne wissen, ob es eine schnellere/bessere Art und Weise, es zu tun. Ich muss auch richtig sein können, ein Array aufgeteilt, auch wenn es eine ungerade Anzahl von Elementen hat, zB:

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

Um Ihre Guss Problem hinzu '.ToArray()' nach der Take zu lösen und überspringen Methoden –

Antwort

38

können Sie verwenden Linq:

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

Warum das funktioniert, trotz der Parität die ursprüngliche Array-Größe?

Das ersteArray dauert array.Length/2 Elemente, und das zweite überspringt die ersten array.Length/2 Elemente, es bedeutet, dass es keinen Konflikt zwischen diesen beiden Arrays gibt. Natürlich, wenn die Anzahl der Elemente ungerade ist, können wir das Array nicht in zwei gleiche Teile teilen.

Wenn Sie in der ersten Hälfte mehr Elemente haben (in dem ungeraden Fall ist), dies zu tun:

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

Danke, ich Werde das bald versuchen, aber wird das das Splitting auch dann richtig handhaben, wenn es eine ungerade Anzahl an Items hat? – 3aw5TZetdf

+0

@MatthewRz, Ja funktioniert immer gut. –

+0

In Ordnung, vielen Dank! – 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

Vielen Dank! Ich werde das bald versuchen. – 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

ein allgemeineren Ansatz, der es in so viele Teile aufgespalten werden wie Sie an:

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

* Herausgegeben Dank skarmats

+2

Dies wird die Reihenfolge der Dinge ändern. Das n-te resultierende Array entspricht also nicht dem n-ten Abschnitt der Quelle. – skarmats

+0

Aktualisiert, um das Striping des Arrays zu verhindern. – Totero

4

Wenn Sie nicht wollen/können LINQ nicht verwenden, können Sie einfach tun:

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