Разбиение массива на 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'
Ответы
Ответ 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);
}