2010-01-09 27 views

Trả lời

5

Cách bạn đang làm việc đó là tốt:

PostType[] q = new PostType[qArray.Length]; 
for (int i = 0; i < q.Length; i++) 
    q[i] = new PostType(); 

Một điều tôi đã thay đổi là đổi tên chỉ số veriable từ x đến tôi, như tôi đã tìm thấy điều này dễ dàng hơn để đọc, mặc dù đó là một điều chủ quan.

Điều khác mà tôi đã thay đổi là điều kiện kết thúc vòng lặp phải phụ thuộc vào độ dài của q, không phải trên chiều dài của qArray. Lý do cho điều này là với phương thức của bạn nếu bạn quyết định thay đổi dòng đầu tiên để sử dụng độ dài khác thay vì qArray.Length, bạn cũng phải nhớ thay đổi dòng thứ hai. Với mã đã sửa đổi, bạn chỉ cần cập nhật dòng mã đầu tiên và phần còn lại sẽ hoạt động mà không cần sửa đổi.

Bạn cũng có thể làm điều này bằng LINQ:

PostType[] q = Enumerable.Range(0, qArray.Length) 
         .Select(_ => new PostType()) 
         .ToArray(); 

Nhưng đối với mảng lớn này sẽ chậm hơn và không thực sự dễ dàng hơn để đọc theo ý kiến ​​của tôi (đặc biệt là nếu bạn không nhìn thấy nó trước đó). Tôi nghĩ tôi có lẽ chỉ cần gắn bó với phương pháp đầu tiên nếu tôi là bạn.

+0

Lặp lại Enumerable sẽ không làm việc vì nó lặp đi lặp lại một tham chiếu đến đối tượng đầu tiên thay vì tạo ra những cái mới – Aly

+0

Enumerable.Range làm việc (nó tạo ra một đối tượng mới cho mỗi cuộc gọi). Nhưng tôi khuyên bạn nên chống lại hoặc lặp lại hoặc phạm vi - cả hai cho khả năng đọc và hiệu suất. Tôi đã cập nhật nhận xét của mình với một ví dụ rõ ràng và giải thích lý do tại sao tôi nghĩ bạn không nên sử dụng nó. –

2

Không có cách nào tốt hơn nếu PostType là một lớp: bạn cần phải truy cập từng vị trí trong mảng và đặt nó.

Nếu PostType là cấu trúc, thì bạn không cần phải làm gì cả: mỗi vị trí trong mảng được tự động khởi tạo thành giá trị mặc định của cấu trúc (tất cả các trường 0). (Nhưng nếu bạn muốn sử dụng một constructor không cố định thì bạn sẽ trở lại vị trí tương tự như với các lớp - bạn cần phải truy cập vào mỗi vị trí và gọi một cách rõ ràng constructor không cố định.)

0

Không phải là tôi có thể nghĩ tắt, khi bạn tạo bộ nhớ mảng được đặt cho nó, khác hơn là mọi chỉ mục trỏ đến null. Cách tốt nhất để làm cho mã của bạn hiệu quả hơn sẽ được lưu trữ qArray.Length vào một biến, do đó bạn không gọi .length trên mỗi lần lặp của vòng lặp tức

int a = qLength 
    for(int x = 0; x < qLength; x++) 
     q[x] = new PostType(); 

Lưu ý: Lặp lại Enumerable sẽ không làm việc vì nó tạo ra một ví dụ của đối tượng và sau đó lặp lại tham chiếu đến đối tượng này.

2

Miếng bánh. Tại sao không làm một cái gì đó như thế này. Nó ngắn gọn.

PostType[] q = qArray.Select(i => new PostType()).ToArray(); 
1

Tôi có một ý tưởng hay, một cách thanh lịch để khởi tạo loại tùy chỉnh mảng.

trước tiên bạn phải khai báo phương thức tĩnh để thực hiện các công việc này trong lớp PostType hoặc trong một lớp mới.

public class PostType 
{ 
    public static T[] extent<T>(int n) 
    { 
     T[] result = new T[n]; 

     if (!typeof(T).IsValueType) 
     { 
      Type type = typeof(T); 
      object objTSource = Activator.CreateInstance(type); 

      for (int i = 0; i < n; i++) 
      { 
       result[i] = (T)objTSource; 
      } 
     } 

     return result; 
    } 
} 

Cuối cùng, nó là một cách thanh lịch:

PostType[] q = PostType.extent<PostType>(qArray.Length); 
Các vấn đề liên quan