2010-06-12 29 views
5

Ví dụLàm thế nào tôi có thể tạo mảng của lớp của tôi với hàm tạo mặc định?

MYCLASS[] myclass = new MYCLASS[10]; 

Bây giờ mảng myclass là tất cả những mảng null nhưng tôi muốn có mặc định xây dựng Mảng .Tôi biết rằng tôi có thể viết lặp cho bộ thiết lập mặc định được xây dựng nhưng tôi đang tìm kiếm một cách dễ dàng hơn và đơn giản.

+0

Nếu bạn có một cấu trúc, sau đó bạn không cần phải khởi tạo tất cả các mục, như họ đã được phân bổ với giá trị mặc định. –

+0

Có, tôi biết rằng – Freshblood

Trả lời

2
var a = Enumerable.Repeat(new MYCLASS(), 10).ToArray(); 
2

Không có cách nào dễ dàng hơn. Nếu bạn không thích vòng lặp, bạn có thể sử dụng

MyClass[] array = new[] { new MyClass(), new MyClass(), new MyClass(), new MyClass() }; 

sẽ cung cấp cho bạn một mảng có 4 phần tử MyClass, được xây dựng với hàm tạo mặc định.

Nếu không, bạn chỉ có tùy chọn sử dụng vòng lặp.

Nếu bạn không muốn viết vòng lặp rằng mỗi khi bạn muốn xây dựng mảng của bạn, bạn có thể tạo một helper-phương pháp, ví dụ như một phương pháp khuyến nông:

static class Extension 
{ 
    public static void ConstructArray<T>(this T[] objArray) where T : new() 
    { 
     for (int i = 0; i < objArray.Length; i++) 
      objArray[i] = new T(); 
    } 
} 

Và sau đó sử dụng nó như này:

MyClass[] array = new MyClass[10]; 
array.ConstructArray(); 
6

Nếu bạn không muốn viết ra các vòng lặp bạn có thể sử dụng thay vì Enumerable.Range:

MyClass[] a = Enumerable.Range(0, 10) 
         .Select(x => new MyClass()) 
         .ToArray(); 

Lưu ý: nó là chậm hơn đáng kể so với phương pháp bạn đề cập đến cách sử dụng một vòng lặp, viết ở đây cho rõ ràng:

MyClass[] a = new MyClass[10]; 
for (int i = 0; i < a.Length; ++i) 
{ 
    a[i] = new MyClass(); 
} 
+0

Điểm chuẩn có thể được tìm thấy tại đây: http://dotnetperls.com/initialize-array –

+0

Tốt hơn nên sử dụng MYCLASS mới [10] thay vì Enumerable.Range (0,10) http://stackoverflow.com/questions/3028192/how-can-i-create-array-of-my-class-with-default-constructor/3028257#3028257 – Freshblood

1

Bạn có thể sử dụng LINQ.

var a = (from x in Enumerable.Range(10) select new MyClass()).ToArray(); 
2

Không thực sự có cách nào tốt hơn. Bạn có thể làm một cái gì đó như:

public static T[] CreateArray<T>(int len) where T : class, new() { 
    T[] arr = new T[len]; 
    for(int i = 0 ; i <arr.Length ; i++) { arr[i] = new T(); } 
    return arr; 
} 

thì ít nhất bạn chỉ cần:

Foo[] data = CreateArray<Foo>(150); 

Cách tiếp cận này ít nhất nên tránh bất kỳ tái phân bổ, và có thể sử dụng tối ưu hóa mảng JIT/chiều dài. Các : class là để tránh sử dụng với các loại giá trị, như với các loại giá trị đã được khởi tạo theo cách này; chỉ new MyValueType[200] sẽ tốt hơn.

1

Nếu chúng ta muốn làm tất cả công việc chỉ trong một dòng mã vì vậy đây là tốt nhất

MYCLASS[] myclass = (new MYCLASS[10]).Select(x => new MYCLASS()).ToArray(); 
+1

Bạn nên cập nhật câu trả lời của mình thay vì cung cấp câu trả lời thứ hai – ChrisF

Các vấn đề liên quan