編集:Take/Skipメソッドを試しましたが、次のエラーが表示されます:
Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<string>' to
'string[]'. An explicit conversion exists (are you missing a cast?)
私はSaeedのコードをコピーしたので、何が悪いのかわかりません。
文字列配列(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'
Linqを使用できます。
firstArray = array.Take(array.Length / 2).ToArray();
secondArray = array.Skip(array.Length / 2).ToArray();
元の配列サイズのパリティにもかかわらず、なぜこれが機能するのですか?
FirstArrayはarray.Length / 2
要素を受け取り、2番目の要素は最初のarray.Length / 2
要素をスキップします。これは、これらの2つの配列間に競合がないことを意味します。もちろん、要素の数が奇数の場合、配列を2つの等しいサイズの部分に分割することはできません。
(奇数の場合)前半でより多くの要素が必要な場合は、次のようにします。
firstArray = array.Take((array.Length + 1) / 2).ToArray();
secondArray = array.Skip((array.Length + 1) / 2).ToArray();
string[] words = {"Apple", "orange", "banana", "pear", "lemon"};
int mid = words.Length/2;
string[] first = words.Take(mid).ToArray();
string[] second = words.Skip(mid).ToArray();
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);
指定した数の部分に分割する、より一般的なアプローチ:
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
string[] words = { "Apple", "orange", "banana", "pear", "lemon" };
var halfWay = words.Length/2;
var firstHalf = words.Take(halfWay);
var secondHalf = words.Skip(halfWay);