2013-10-23 69 views
2

我用C#和有麻烦把一些数组类型相当新。转换JavaScript以C# - 阵列

JavaScript代码:

function toMatrix(list, elementsPerSubArray) { 
    var matrix = [], i, k; 
    for (i = 0, k = -1; i < list.length; i++) { 
     if (i % elementsPerSubArray === 0) { 
      k++; 
      matrix[k] = []; 
     } 
     matrix[k].push(list[i]); 
    } 
    return matrix; 
} 

我曾尝试转换代码,但我在C#中的数组斗争。

这可能很容易一些,我会怎么做呢?

谢谢。

回答

3

这是一种尝试。我使用的项目类型的通用参数:

List<List<T>> toMatrix<T>(List<T> list, int elementsPerSubArray) 
{ 
    var matrix = new List<List<T>>(); 
    int k = -1; 
    for (int i = 0 ; i < list.Length; i++) 
    { 
     if (i % elementsPerSubArray == 0) 
     { 
      k++; 
      matrix.Add(new List<T>()); 
     } 
     matrix[k].Add(list[i]); 
    } 
    return matrix; 
} 

测试:

List<int> input = new List<int> { 1, 2, 3, 4, 5, }; 
var result = toMatrix(input, 2); 
    foreach (var outer in result) 
     Console.WriteLine(string.Join(", ", outer)); 

(Demo on Ideone)

+0

我怎么会去将其转换回:

using System.Linq; using System.Collections.Generic; public T[][] ToMatrix<T>(T[] array, int elementsPerSubArray) { var list = new List<T[]>(); while (array.Any()) { list.Add(array.Take(elementsPerSubArray).ToArray()); array = array.Skip(elementsPerSubArray).ToArray(); } return list.ToArray(); } 

转换回可以在一个线路可以实现吗?谢谢 – user2909323

+1

'matrix.Aggregate(new T [0],(array,matrixRow)=> array.Concat(matrixRow).ToArray());'。这就是为什么我喜欢Linq:这是对世界的函数式编程视图的一瞥,用最初的面向对象语言实现。 –

0

LINQ的版本是这样的。

public T[] ToArray<T>(T[][] matrix) 
{ 
    return matrix.Aggregate(new T[0], (array, matrixRow) => array.Concat(matrixRow).ToArray()); 
}