Подтвердить что ты не робот

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

Изменить: я пробовал метод Take/Skip, но получаю следующую ошибку:

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

Я не знаю, что я делаю неправильно, потому что я скопировал код Саида.

У меня есть строковый массив (содержащий от 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'
4b9b3361

Ответ 1

Вы можете использовать linq:

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

Ответ 2

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

Ответ 3

Более обобщенный подход, который разделит его на столько частей, сколько вы указываете:

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

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

Ответ 4

Если вы не хотите/не можете использовать LINQ, вы можете просто:

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

Ответ 5

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

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

Ответ 6

На тот случай, если кто-то захочет использовать функцию:

    static void Main(string[] args)
    {
        string[] ar = { "apple", "orange", "banana", "pear", "lemon" };

        int half =  ar.Length / 2;

        //  Console.WriteLine(string.Join(',', Split(ar,0, half)));

        Console.WriteLine(string.Join(',', Split(ar,half, ar.Length)));

        Console.ReadKey();
    }


    public static IEnumerable<T> Split<T>(IEnumerable<T> items, int start, int end)
    {
        return items.Skip(start).Take(end);
    }