2012-05-22 17 views
12

Edit: Próbowałem na wynos/metoda Pomiń ale pojawia się następujący błąd:Dzielenie tablicą na 2 tablicach C#

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

nie wiem co robię źle, bo kopiowane Saeed użytkownika kod.

Mam tablicę ciągów znaków (zawierającą od 20 do 300 elementów) i chcę podzielić ją na dwie oddzielne tablice od środka pierwszej.

Wiem, w jaki sposób mogę to zrobić za pomocą pętli for, ale chciałbym wiedzieć, czy był szybszy/lepszy sposób robienia tego. Ja również muszą być w stanie prawidłowo podzielić tablicę nawet jeśli ma nieparzystą liczbę elementów, np:

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

Aby rozwiązać problem obsady dodać '.ToArray()' po Bierzcie i pominąć Metody –

Odpowiedz

38

Można użyć LINQ:

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

Dlaczego to działa, mimo parytetu oryginalny rozmiar tablicy?

firstArray trwa array.Length/2 elementów, a drugi pomija pierwsze array.Length/2 elementy, to znaczy nie ma żadnego konfliktu między tymi dwiema tablicami. Oczywiście, jeśli liczba elementów jest nieparzysta, nie możemy podzielić tablicy na dwie części o jednakowej wielkości.

Jeśli chcesz mieć więcej elementów w pierwszej połowie (w dziwnym wypadku), to zrobić:

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

Dzięki, spróbuje to wkrótce, ale czy to zajmie się poprawnie dzieleniem, nawet jeśli ma nieparzystą liczbę elementów? – 3aw5TZetdf

+0

@MatthewRz, Tak zawsze działa poprawnie. –

+0

W porządku, dziękuję bardzo! – 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

Dziękujemy! Spróbuję tego wkrótce. – 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

Bardziej uogólnione podejście, które podzielono go na tyle części jak można określić:

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

* redakcją skarmats Dzięki

+2

To zmieni kolejność rzeczy. Tak więc n-ta tablica wynikowa nie będzie odpowiadała n-tej sekcji źródła. – skarmats

+0

Zaktualizowano, aby zapobiec rozbieraniu macierzy. – Totero

4

Jeśli nie chcą/nie mogą używać LINQ można po prostu zrobić:

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