我有一个C#WCF webservice,由两个VB 6项目调用。目标VB项目正在向客户端VB项目发送一个多维数组。
我想将多维数组转换为锯齿状数组,但我没有运气。
如何在我的对象[,]中找到能够初始化锯齿状阵列的油脂数量?
我想按照this question的回答,但我的对象上没有GetLength
方法。
我试过了:
int firstElement = astrManTfrLetters.GetLength(0);
int secondElement = astrManTfrLetters.GetLength(1);
我被困在这里。
答案 0 :(得分:13)
通常所提出的解决方案假定基于0的索引,但情况并非总是如此,主要是在客户端处理对象[,]用于Microsoft Excel。这是任何指数的解决方案。
internal static class ExtensionMethods
{
internal static T[][] ToJaggedArray<T>(this T[,] twoDimensionalArray)
{
int rowsFirstIndex = twoDimensionalArray.GetLowerBound(0);
int rowsLastIndex = twoDimensionalArray.GetUpperBound(0);
int numberOfRows = rowsLastIndex + 1;
int columnsFirstIndex = twoDimensionalArray.GetLowerBound(1);
int columnsLastIndex = twoDimensionalArray.GetUpperBound(1);
int numberOfColumns = columnsLastIndex + 1;
T[][] jaggedArray = new T[numberOfRows][];
for (int i = rowsFirstIndex; i <= rowsLastIndex; i++)
{
jaggedArray[i] = new T[numberOfColumns];
for (int j = columnsFirstIndex; j <= columnsLastIndex; j++)
{
jaggedArray[i][j] = twoDimensionalArray[i, j];
}
}
return jaggedArray;
}
}
答案 1 :(得分:2)
默认情况下,C#生成基于0的数组。 我已经调整了Pedro的解决方案如下:
internal static class ExtensionMethods
{
internal static T[][] ToJaggedArray<T>(this T[,] twoDimensionalArray)
{
int rowsFirstIndex = twoDimensionalArray.GetLowerBound(0);
int rowsLastIndex = twoDimensionalArray.GetUpperBound(0);
int numberOfRows = rowsLastIndex - rowsFirstIndex + 1;
int columnsFirstIndex = twoDimensionalArray.GetLowerBound(1);
int columnsLastIndex = twoDimensionalArray.GetUpperBound(1);
int numberOfColumns = columnsLastIndex - columnsFirstIndex + 1;
T[][] jaggedArray = new T[numberOfRows][];
for (int i = 0; i < numberOfRows; i++)
{
jaggedArray[i] = new T[numberOfColumns];
for (int j = 0; j < numberOfColumns; j++)
{
jaggedArray[i][j] = twoDimensionalArray[i + rowsFirstIndex, j + columnsFirstIndex];
}
}
return jaggedArray;
}
}
答案 2 :(得分:1)
这对我有用,不需要任何循环。它花了一个对象[85000,26],并在一秒钟内将其转换为对象[85000] [26]。
object[,] obj2D = ...
// Take my 2D array and cast it as a 1D array
object[] obj1D = ((object[,]) obj2D).Cast<object>().ToArray();
// using linq, chunk the 1D array back into a jagged array
Int32 j = 0;
object[][] jagged = obj1D.GroupBy(x => j++ / obj2D.GetLength(1)).Select(y => y.ToArray()).ToArray();