KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
So it turns out all arrays are not created equal. Multi-dimensional arrays can have non-zero lower bounds. See for example Excel PIA's Range.Value property object[,] rectData = myRange.Value; I need to convert these data into a jagged array. My first try below smells of complexity. Any suggestions to optimize it? It needs to handle the general case where lower bounds may not be zero. I have this ex method: public static T[][] AsJagged<T>( this T[,] rect ) { int row1 = rect.GetLowerBound(0); int rowN = rect.GetUpperBound(0); int col1 = rect.GetLowerBound(1); int colN = rect.GetUpperBound(1); int height = rowN - row1 + 1; int width = colN - col1 + 1; T[][] jagged = new T[height][]; int k = 0; int l; for ( int i = row1; i < row1 + height; i++ ) { l = 0; T[] temp = new T[width]; for ( int j = col1; j < col1 + width; j++ ) temp[l++] = rect[i, j]; jagged[k++] = temp; } return jagged; } Used like this: public void Foo() { int[,] iRect1 = { { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 } }; int[][] iJagged1 = iRect1.AsJagged(); int[] lengths = { 3, 5 }; int[] lowerBounds = { 7, 8 }; int[,] iRect2 = (int[,])Array.CreateInstance(typeof(int), lengths, lowerBounds); int[][] iJagged2 = iRect2.AsJagged(); } Curious if Buffer.BlockCopy() would work or be faster? Edit: AsJagged needs to handle reference types. Edit: Found bug in AsJagged(). Added int l ; and added col1 + width to inner loop.
Tags (comma-separated)
Save Edits
Cancel