【发布时间】:2019-03-29 13:51:27
【问题描述】:
我有一个二维 object[,] 数组,其中包含行和列矩阵 (object[nRows, nColumns])。
我想把它分成一批行 - 例如每批 1,000 行,我可以枚举。
总而言之,我正在寻找可以执行以下操作但针对二维数组 (source) 的 C# 代码:
private IEnumerable<T[]> SplitArray<T>(T[] sourceArray, int rangeLength)
{
int startIndex = 0;
do
{
T[] range = new T[Math.Min(rangeLength, sourceArray.Length - startIndex)];
Array.Copy(sourceArray, startIndex, range, 0, range.Length);
startIndex += rangeLength;
yield return range;
}
while (startIndex < sourceArray.Length);
}
这种为 [,] 数组调整代码的尝试失败了 - 在第一次迭代后行/列开始变得混乱:
private IEnumerable<T[,]> SplitArray<T>(T[,] sourceArray, int rangeLength)
{
int startIndex = 0;
do
{
T[,] range = new T[Math.Min(rangeLength, sourceArray.GetLength(0) - startIndex), sourceArray.GetLength(1)];
Array.Copy(sourceArray, startIndex, range, 0, range.Length);
startIndex += rangeLength;
yield return range;
}
while (startIndex < sourceArray.GetLength(0));
}
【问题讨论】:
-
是什么阻止您独立枚举二维数组中的不同行?应该没有必要仅仅为此目的创建阵列的(部分)克隆。 (另一方面,如果拆分和创建新数组是您想要的,那么您将问题中的代码调整为 2D
[,]数组的问题究竟是什么?) -
谢谢!它们需要被分块,因为它们必须通过 COM 互操作批量处理到另一个应用程序中。单行会导致调用过多,一次执行所有行会导致内存不足。我尝试调整代码更新了这个问题。
-
我对你的理解正确吗 - 你想在“方形”子数组(块)中分解一个二维数组吗?你想如何处理边缘/剩菜?
-
请注意,Array.Copy 将 2D 数组视为 1D 数组(其中 2D 数组的元素以行优先顺序出现)。因此,startIndex 的值与 1st rank 的长度(即行的长度)无关。这意味着,像您在那里所做的那样组合
sourceArray.GetLength(0) - startIndex几乎没有意义。此外,startIndex += rangeLength也没有多大意义,因为您只是复制了 range.Length 元素,而不是 rangeLength 元素(因为您似乎仅将 rangeLength 用作二维中一维的范围数组) -
@BartvanderDrift 我认为这就是我遇到的问题。每个块应该是一组独立的行,其所有列都保持不变 - 如果我有任何意义的话。
标签: c# arrays multidimensional-array