这可能听起来是根本问题,但我完全无法找到对我的应用程序没有性能影响的有效解决方案
我有一个动态的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[,]
答案 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;
}