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;