C#拆分数组
我需要在中点将一个不确定大小的数组拆分成两个独立的数组。
使用ToArray()从字符串列表生成数组。
public void AddToList () { bool loop = true; string a = ""; Console.WriteLine("Enter a string value and press enter to add it to the list"); while (loop == true) { a = Console.ReadLine(); if (a != "") { mylist.Add(a); } else { loop = false; } } } public void ReturnList() { string x = ""; foreach (string number in mylist) { x = x + number + " "; } Console.WriteLine(x); Console.ReadLine(); } } class SplitList { public string[] sTop; public string[] sBottom; public void Split(ref UList list) { string[] s = list.mylist.ToArray(); //split the array into top and bottom halfs } } static void Main(string[] args) { UList list = new UList(); SplitList split = new SplitList(); list.AddToList(); list.ReturnList(); split.Split(ref list); } }
}
您可以使用以下方法将数组拆分为2个单独的数组
public void Split(T[] array, int index, out T[] first, out T[] second) { first = array.Take(index).ToArray(); second = array.Skip(index).ToArray(); } public void SplitMidPoint (T[] array, out T[] first, out T[] second) { Split(array, array.Length / 2, out first, out second); }
使用通用拆分方法:
public static void Split(T[] source, int index, out T[] first, out T last) { int len2 = source.Length - index; first = new T[index]; last = new T[len2]; Array.Copy(source, 0, first, 0, index); Array.Copy(source, index, last, 0, len2); }
我还想添加一个解决方案,将一个数组拆分成几个包含确定数量单元格的较小数组。
一种不错的方法是创建一个通用/扩展方法来拆分任何数组。 这是我的:
/// /// Splits an array into several smaller arrays. /// /// The type of the array. /// The array to split. /// The size of the smaller arrays. /// An array containing smaller arrays. public static IEnumerable> Split(this T[] array, int size) { for (var i = 0; i < (float)array.Length / size; i++) { yield return array.Skip(i * size).Take(size); } }
而且,该解决方案被推迟。 然后,只需在数组上调用split(size)
。
var array = new byte[] {10, 20, 30, 40, 50}; var splitArray = array.Split(2);
玩得开心 :)
当处理具有大量元素(即字节数组)的数组时,我遇到了Linq的Skip()和Take()函数的问题,其中元素数量是数百万。
这种方法大大减少了我的分割执行时间。
public static IEnumerable> Split(this ICollection self, int chunkSize) { var splitList = new List>(); var chunkCount = (int)Math.Ceiling((double)self.Count / (double)chunkSize); for(int c = 0; c < chunkCount; c++) { var skip = c * chunkSize; var take = skip + chunkSize; var chunk = new List (chunkSize); for(int e = skip; e < take && e < self.Count; e++) { chunk.Add(self.ElementAt(e)); } splitList.Add(chunk); } return splitList; }
如果您没有Linq,可以使用Array.Copy:
public void Split(ref UList list) { string[] s = list.mylist.ToArray(); //split the array into top and bottom halfs string[] top = new string[s.Length / 2]; string[] bottom = new string[s.Length - s.Length / 2]; Array.Copy(s, top, top.Length); Array.Copy(s, top.Length, bottom, 0, bottom.Length); Console.WriteLine("Top: "); foreach (string item in top) Console.WriteLine(item); Console.WriteLine("Bottom: "); foreach (string item in bottom) Console.WriteLine(item); }
你为什么要通过UList
作为参考? 似乎没有必要这样做。
如果我需要这样做,我会使用通用的Split
方法:
public void Split(T[] array, out T[] left, out T[] right) { left = new T[array.Length / 2]; right = new T[array.Length - left.Length]; Array.Copy(array, left, left.Length); Array.Copy(array, left.Length, right, 0, right.Length); }
我认为您正在寻找的是Array
类,特别是Array.Copy
静态方法。 如果C#数组有方法,您可以将该类视为包含将成为数组实例方法的方法。
为什么不分配两个数组并复制内容?
编辑:你走了:
String[] origin = new String[4]; origin[0] = "zero"; origin[1] = "one"; origin[2] = "two"; origin[3] = "three"; Int32 topSize = origin.Length / 2; Int32 bottomSize = origin.Length - topSize; String[] sTop = new String[topSize]; String[] sBottom = new String[bottomSize]; Array.Copy(origin, sTop, topSize); Array.Copy(origin, topSize , sBottom, 0, bottomSize);
这就是我需要的
PartItemCount = Math.Max( PartItemCount , 1 ); lstlst = new List>(); for ( ; lst.Count > 0 ; ) { int partCount = Math.Min( lst.Count , PartItemCount ); List lsttmp = new List ( lst.Take( partCount ).ToArray() ); lstlst.Add( lsttmp ); lst = lst.Skip( partCount ).ToList(); } return lstlst.Count;