Bạn không thể, về cơ bản. Khi bạn tạo một mảng, nó luôn được điền ban đầu với giá trị mặc định cho loại - mà cho một lớp luôn là tham chiếu null. Đối với int
đã ghi bàn 0, cho bool
đó là sai vv
(Nếu bạn sử dụng một initializer mảng, mà sẽ tạo ra "trống rỗng" mảng và sau đó cư nó với các giá trị mà bạn đã chỉ định, tất nhiên.)
Có nhiều cách khác nhau để điền vào mảng bằng cách gọi hàm dựng - tôi có thể có lẽ là chỉ sử dụng vòng lặp foreach. Sử dụng LINQ với Enumerable.Range/Lặp lại cảm thấy một chút buộc.
Tất nhiên, bạn luôn có có thể viết phương pháp dân riêng của bạn, thậm chí như một phương pháp khuyến nông:
public static T[] Populate<T>(this T[] array, Func<T> provider)
{
for (int i = 0; i < array.Length; i++)
{
array[i] = provider();
}
return array;
}
Sau đó, bạn có thể sử dụng:
Sample[] samples = new Sample[100].Populate(() => new Sample());
Những gì tôi thích về giải pháp này:
- Nó vẫn là một biểu thức duy nhất, có thể hữu ích trong nhiều kịch bản
- Nó không giới thiệu các khái niệm bạn không thực sự muốn (như lặp đi lặp lại một giá trị duy nhất hoặc tạo ra một phạm vi)
Tất nhiên bạn có thể thêm nhiều lựa chọn:
- Một tình trạng quá tải mà mất một
Func<int, T>
thay vì một Func<T>
, đi qua các chỉ số để các nhà cung cấp
- một phương pháp không gia hạn mà tạo ra các mảng và populates nó
Nguồn
2011-01-29 21:19:19
tại sao bạn không chỉ cần sử dụng chỉ số mảng, gia tăng độc đáo và tự động của nó theo mã của bạn –
Trên một mặt lưu ý - mã mà không phải là thread-safe; bạn nên sử dụng 'id = Interlocked.Increment (ref count)' thay vào đó, và bắt đầu với 'static int count = 1' (vì' Interlocked.Increment' trả về giá trị * cũ *). –
cũng trong đoạn mã trên bạn vừa khai báo một mảng có kích thước 100, không có mục nào trong đó. – Victor