Vì vậy, it turns out tất cả các mảng không được tạo bằng nhau. Mảng đa chiều có thể có giới hạn dưới khác không. Xem ví dụ về thuộc tính Range.Value của Excel PIA object[,] rectData = myRange.Value;
Cách nhanh nhất để chuyển đổi T [,] thành T [] []?
Tôi cần phải chuyển đổi những dữ liệu này thành một mảng răng cưa. Lần thử đầu tiên của tôi bên dưới mùi phức tạp. Bất kỳ đề xuất nào để tối ưu hóa nó? Nó cần phải xử lý các trường hợp chung mà giới hạn dưới có thể không bằng không.
tôi có phương pháp này ví dụ:
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;
}
Được sử dụng như thế này:
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();
}
Tò mò nếu Buffer.BlockCopy() sẽ làm việc hoặc được nhanh hơn?
Chỉnh sửa: AsJagged cần xử lý các loại tham chiếu.
Chỉnh sửa: Đã tìm thấy lỗi trong AsJagged(). Đã thêm int l
; và thêm col1 + width
vào vòng lặp bên trong.
+1 cho điều toán học. Đây là một hoạt động không tribvial bất kể làm thế nào bạn biến nó bởi vì bạn phải chỉ cần sao chép tất cả các dữ liệu cho mỗi định nghĩa. Điều tốt nhất bạn có thể đi vào là việc này được thực hiện bằng các phương thức chặn, không phải mục thủ công theo bản sao của mục, nhưng nó là một hoạt động chậm. Không có gì trên thế giới sẽ thay đổi điều đó. – TomTom
+1 cũng cho phân tích O-quốc gia. Tuy nhiên, lưu ý rằng trình biên dịch C# thực sự tối ưu hóa khá ít so với thường được giả định. Hầu hết các tối ưu hóa thực sự được thực hiện, khi jitting IL để mã máy. Vì vậy, trừ khi bạn là tốt trong lắp ráp của bạn (x86, x64, bất cứ điều gì) nó không phải là quá dễ dàng để thực sự chứng minh những gì được thực hiện và những gì không. –
Các bạn, hãy xem gợi ý cuối cùng của tôi, nó tránh sao chép toàn bộ dữ liệu. – zmbq