Разбиение массива на 2 массива C #

Edit: I have tried the Take/Skip method but I get the following error:

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

I do not know what I am doing wrong because I copied Saeed's code.

У меня есть массив строк (содержащий от 20 до 300 элементов), и я хочу разбить его на 2 отдельных массива, начиная с середины первого.

Я знаю, как я могу сделать это, используя цикл for, но я хотел бы знать, есть ли более быстрый / лучший способ сделать это. Мне также нужно иметь возможность правильно разделить массив, даже если он имеет нечетное количество элементов, например:

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'
 Bob Vale14 окт. 2013 г., 14:53
Чтобы решить вашу проблему, добавьте.ToArray() после методов Take и Skip

Ответы на вопрос(5)

Решение Вопроса

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

Почему это работает, несмотря на соотношение исходного размера массива?

FirstArray принимаетarray.Length / 2 элементы, а второй пропускает первыйarray.Length / 2 элементы, это означает, что нет никакого конфликта между этими двумя массивами. Конечно, если количество элементов нечетное, мы не можем разбить массив на две части одинакового размера.

Если вы хотите иметь больше элементов в первой половине (в нечетном случае), сделайте это:

firstArray = array.Take((array.Length + 1) / 2).ToArray();
secondArray = array.Skip((array.Length + 1) / 2).ToArray();
 22 мая 2012 г., 12:57
@MatthewRz, да всегда работает нормально.
 22 окт. 2015 г., 13:13
@saeed +1 4 мой друг и коллега + полезный ответ;)
 22 мая 2012 г., 13:03
@ LukeH, спасибо, я не читал его комментарии, я обновил ответ в соответствии с твоей заметкой. (Также я Saeed, а не Saaed :)
 matthewr22 мая 2012 г., 12:56
Спасибо, я скоро попробую, но будет ли это правильно обрабатывать разбиение, даже если у него нечетное количество элементов?
 matthewr22 мая 2012 г., 13:03
@ LukeH Неважно, какой массив (первый или второй) имеет дополнительный элемент, но спасибо за комментарий!

который разделит его на столько частей, сколько вы укажете:

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

* Отредактировано Спасибо скарматам

 22 мая 2012 г., 12:59
Это изменит порядок вещей. Таким образом, результирующий массив n не будет соответствовать n-му разделу источника.
 25 мая 2012 г., 14:04
Обновлен, чтобы предотвратить чередование массива.
string[] words = {"apple", "orange", "banana", "pear", "lemon"};
int mid = words.Length/2;
string[] first = words.Take(mid).ToArray();
string[] second = words.Skip(mid).ToArray();
 matthewr22 мая 2012 г., 12:56
Спасибо! Я попробую это в ближайшее время.

вы можете просто сделать:

    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);
Решение Вопроса
string[] words = { "apple", "orange", "banana", "pear", "lemon" };
var halfWay = words.Length/2;

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

Ваш ответ на вопрос