使用LINQ拆分数组

我有一个像这样的单维集合:

[1,2,4,5.....n] 

我想在这样的二维集合中转换该集合:

 [[1,2,3], [4,5,6], ...] 

基本上我想要分组或拆分,如果你想要的话,数组是’n’个成员

我可以用foreach语句来做,但我目前正在学习LINQ,所以不是迭代遍历所有元素并手动创建一个新数组,我想使用LINQfunction(如果适用)

有没有LINQ函数来帮助我完成这个?

我想在GroupBySelectMany我不知道他们是否会帮助我,但他们可能会

任何帮助将真正欣赏它=):**

您可以按索引分组除以批量大小,如下所示:

 var batchSize = 3; var batched = orig .Select((Value, Index) => new {Value, Index}) .GroupBy(p => p.Index/batchSize) .Select(g => g.Select(p => p.Value).ToList()); 

使用MoreLinq .Batch

  var result = inputArray.Batch(n); // n -> batch size 

  var inputs = Enumerable.Range(1,10); var output = inputs.Batch(3); var outputAsArray = inputs.Batch(3).Select(x=>x.ToArray()).ToArray(); //If require as array 

你想要Take()Skip() 。 这些方法可以让你拆分一个IEnumerable 。 然后你可以使用Concat()再次将它们拼接在一起。

下面的示例将一个数组拆分为每组4个项目。

 int[] items = Enumerable.Range(1, 20).ToArray(); // Generate a test array to split int[][] groupedItems = items .Select((item, index) => index % 4 == 0 ? items.Skip(index).Take(4).ToArray() : null) .Where(group => group != null) .ToArray(); 

它不是纯粹的LINQ,但它打算与它一起使用:

 public static class MyEnumerableExtensions { public static IEnumerable Split(this IEnumerable source, int size) { if (source == null) { throw new ArgumentNullException("source can't be null."); } if (size == 0) { throw new ArgumentOutOfRangeException("Chunk size can't be 0."); } List result = new List(size); foreach (T x in source) { result.Add(x); if (result.Count == size) { yield return result.ToArray(); result = new List(size); } } } } 

它可以在您的代码中使用:

 private void Test() { // Here's your original sequence IEnumerable seq = new[] { 1, 2, 3, 4, 5, 6 }; // Here's the result of splitting into chunks of some length // (here's the chunks length equals 3). // You can manipulate with this sequence further, // like filtering or joining etc var splitted = seq.Split(3); } 

它很简单:

 static class LinqExtensions { public static IEnumerable> ToPages(this IEnumerable elements, int pageSize) { if (elements == null) throw new ArgumentNullException("elements"); if (pageSize <= 0) throw new ArgumentOutOfRangeException("pageSize","Must be greater than 0!"); int i = 0; var paged = elements.GroupBy(p => i++ / pageSize); return paged; } }