[英]Splitting an array into 2 arrays C#
編輯:我嘗試了 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
元素,第二個跳過第一個array.Length / 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);
您可以使用范圍表示法很容易地實現這一點:
var x = new[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
var pivot = x.Length / 2;
var p1 = x[..pivot];
var p2 = x[pivot..];
以防萬一有人想改用函數:
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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.