Bạn có thể thực hiện các thao tác trên mảng không phụ thuộc vào thứ hạng của mảng. Trình vòng lặp không phải lúc nào cũng là giải pháp phù hợp. mảng đã cho
double[,] myarray = new double[10,5];
Nên thực hiện quy trình làm việc sau:
- Định hình lại mảng có Thứ hạng>1 thành một mảng tuyến tính có thứ hạng = 1 và cùng số phần tử. Điều này sẽ xảy ra tại chỗ để cải thiện hiệu quả thời gian chạy. Sao chép không được phép.
- Truyền mảng đã được định hình lại cho phương thức chỉ được xác định cho mảng Hạng=1. Ví dụ mảng.copy()
- Định hình lại mảng kết quả về thứ hạng và kích thước ban đầu.
Có một câu hỏi tương tự về chủ đề này:Cách định hình lại mảng trong C# .Giải pháp ở đó sử dụng thao tác sao chép bộ nhớ của BlockCopy().
我的问题是:Có thể thực hiện được kiểu định hình lại này mà không cần sao chép bộ nhớ không? Hoặc thậm chí theo cách tạm thời, như tạo Chế độ xem dữ liệu mới?
Cách diễn đạt ở đây hơi khó khăn nhưng chắc chắn không an toàn
Và đã sửa
sẽ hoạt động. Không cần sao chép bộ nhớ, truy cập trực tiếp, nêm hạt tiêu và muối
CLR Không cho phép bạn truyền mảng theo cách bạn muốn, bất kỳ phương pháp nào khác mà bạn có thể nghĩ đến đều yêu cầu phân bổ một mảng mới và sao chép nó (lưu ý rằng bạn có thể thực hiện việc đó nhanh như chớp). Cách khả thi duy nhất khác là sử dụng cố định, cách này sẽ cung cấp cho bạn mảng 1D liền kề.
không an toàn public static void SomeMethod(int* p, int size)
{
cho (var i = 0; i < 4; i++)
{
//Thực hiện bất kỳ thao tác tuyến tính nào
*(p + i) *= 10;
}
}
...
var someArray = new int[2,2];
someArray[0, 0] = 1;
someArray[0,1] = 2;
someArray[1, 0] = 3;
someArray[1, 1] = 4;
//Định hình lại mảng thành mảng tuyến tính
đã sửa (int* p = someArray)
{
SomeMethod(p, 4);
}
// Định hình lại mảng kết quả về thứ hạng và kích thước ban đầu.
cho (int i = 0; i < 2; i++)
{
vì (int j = 0; j < 2; j++)
{
Console.WriteLine(someArray[i, j]);
}
}
输出
10
20
30
40
Tôi là một lập trình viên xuất sắc, rất giỏi!