Вопрос по arrays, c#, linq – Разбиение массива на 2 массива C #

16

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

Ваш Ответ

5   ответов
46

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();
@MatthewRz, да всегда работает нормально.
@saeed +1 4 мой друг и коллега + полезный ответ;)
@ LukeH, спасибо, я не читал его комментарии, я обновил ответ в соответствии с твоей заметкой. (Также я Saeed, а не Saaed :)
Спасибо, я скоро попробую, но будет ли это правильно обрабатывать разбиение, даже если у него нечетное количество элементов? matthewr
@ LukeH Неважно, какой массив (первый или второй) имеет дополнительный элемент, но спасибо за комментарий! matthewr
4

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

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

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

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

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

    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);
2
string[] words = { "apple", "orange", "banana", "pear", "lemon" };
var halfWay = words.Length/2;

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

Похожие вопросы