cập nhật: Như Jon Skeet đúng khi chỉ ra, điều này không p rovide một tham chiếu vào hàng, nhưng thay vì tạo một bản sao mới. Nếu mã của bạn cần phải thay đổi một hàng, phương pháp này không hoạt động. Tôi đã đổi tên phương thức để làm rõ điều này.
Cập nhật 2: Nếu bạn muốn có thể chỉnh sửa trường và có thay đổi xảy ra với mảng mẹ, bạn có thể sử dụng trình bao bọc mà tôi cung cấp trong this library I maed. Hàng kết quả foo.Row(i)
không phải là một mảng, mà thay vào đó thực hiện IList
, vì vậy nếu bạn cần để chuyển một mảng thì đây không phải là giải pháp.
Phương pháp mở rộng này sẽ cho phép bạn truy vấn mảng đa chiều cho các hàng. Cần lưu ý rằng điều này là nặng tính toán (không hiệu quả) và nếu thì có thể bạn nên sử dụng một mảng răng cưa cho những tình huống này. Tuy nhiên, nếu bạn thấy mình trong một tình huống mà bạn không thể sử dụng một mảng răng cưa, điều này có thể hữu ích.
public static T[] CopyRow<T>(this T[,] arr, int row)
{
if (row > arr.GetLength(0))
throw new ArgumentOutOfRangeException("No such row in array.", "row");
var result = new T[arr.GetLength(1)];
for (int i = 0; i < result.Length; i++)
{
result[i] = arr[row, i];
}
return result;
}
Mã của bạn bây giờ có thể được viết lại:
int[,] foo;
foo = new int[6,4];
int[] least;
least = new int[6];
for(int i = 0; i < 6; i++)
{
least[i] = FindLeast(ref foo.CopyRow(i));
}
Nguồn
2014-05-02 13:49:17
Tôi có thể chuyển một mảng hình chữ nhật sang một hàm chấp nhận các mảng có răng cưa không? – CodeKingPlusPlus
@CodeKingPlusPlus: Không, bạn không thể – BlackBear
Vì vậy, về cơ bản đây không phải là một giải pháp :) –