将列附加到数组

时间:2013-12-11 09:21:16

标签: c# .net-4.0

这可能听起来是根本问题,但我完全无法找到对我的应用程序没有性能影响的有效解决方案

我有一个动态的2D数组,我不知道它在初始时的大小

object[,] 2d = GetData();

然后我有一个for循环,每个循环返回一维数组,行数与第二行数相同。

foreach (var col in externalData)
{
  // here append to 2d array
}

我是否必须为每个循环创建一个新数组并复制所有数组?还是有更快的解决方案? 我确信有一个我无法想到的简单解决方案。

修改

示例,2d数组的值为

1 2 3
4 5 6
4 5 5
1 1 1

然后让我们说for循环生成2个数组

6
5
4
2

4
5
2
2

现在我想将for循环的2个结果附加到2D数组 所以最后的冲击应该像

1 2 3 6 4
4 5 6 5 5
4 5 5 4 2
1 1 1 2 2

重要的是最终结果应该是object[,]

的类型

1 个答案:

答案 0 :(得分:1)

通常使用锯齿状数组而不是多维数组,但

因为您不知道初始化的大小,所以不要使用数组。

对于你的例子来说,

var twoD = new List<List<int>>
    {
       { 1, 2, 3 }
       { 4, 5, 6 }
       { 4, 5, 5 }
       { 1, 1, 1 }
    }

代替。


然后你可以使用像

这样的通用扩展名
void AddColumn(this List<List<T>> source, IList<T> column)
{
   if (column is null)
   {
       throw new ArgumentNullException("column");
   }

   if (column.Count != source.Count)
   {
       throw new ArgumentException("column");
   }

   for(var i = 0; i < source.Count; i++)
   {
       source[i].Add(column[i]);
   }
}

添加列。像这样,

twoD.AddColumn(new[]
    {
        6,
        5,
        4,
        2
    });

然后,当您完成操作后,可以使用

object[,] ToMultiObject<T>(this IList<IList<T>> source)
{
    var x = source.Max(r => r.Count);
    var y = source.Count;

    var result = new object[x, y];
    for (var i = 0, i < source.Count, i++)
    {
        for (var j = 0, j < source[i].Count, j++)
        {
            result[j, i] = source[i][j];
        }
    }

    return result;
}