如何将锯齿状数组制作成2D数组C#

时间:2016-04-05 20:39:53

标签: c# arrays multidimensional-array jagged-arrays

我想制作具有不同列长度的2D锯齿状阵列作为具有相等列长度的2D阵列。 我尝试将int[][]转换为List<List<int>>。 例如, 我如何制作

int[][] = 
{0,1,1},
{1,1,1,1},
{1,1,1,1},
{0,1,1}

int[][] = 
{0,1,1,0},
{1,1,1,1},
{1,1,1,1},
{0,1,1,0}  // (inserting 0 to extended space)

2 个答案:

答案 0 :(得分:2)

你在两个时间都使用int[][],而不是替代int[,]所以我会忽略术语,并假设你只想填0来使所有内容都相同:

int[][] arr = ...

int maxLength = arr.Max(x => x.Length);
var arr2 = arr.Select(x =>
                      {
                          if (x.Length == maxLength)
                              return x;
                          var y = new int[maxLength];
                          x.CopyTo(y, 0);
                          return y;
                      }).ToArray();

// now arr2 is the same as arr but with uniform lengths and padded 0's at the end

此方法执行许多分配。另一种方法是:

List<List<int>> lists = ...

// with linq:
int maxLength = lists.Max(x => x.Count);

// without-linq:
int maxLength = 0;
foreach (var list in lists)
    if (list.Count > maxLength)
        maxLength = list.Count;
// end without-linq

foreach (List<int> list in lists)
    while (list.Count < maxLength)
        list.Add(0);

选择您喜欢的更好,更适合您的情况。

你也可以避免在第一种方法中使用Linq(如果你想的话),但我没有打扰那个。

答案 1 :(得分:0)

这样的事情对你有用吗?

List<List<int>> jagged = ...

var maxLen = jagged.Max(x => x.Count);
for (var i=0; i<jagged.Count; i++){
    while (jagged[i].Count < maxLen) jagged[i].Add(0);
}

dotnetfiddle