2013-02-14 53 views
7

Hiện nay tôi có đoạn mã sau:lớp mới trong vòng lặp for

 DecisionVariable[] attributes = 
     { 
      new DecisionVariable("Var1", 2), 
      new DecisionVariable("Var2", 4), 
      new DecisionVariable("Var3", 1), 
      new DecisionVariable("Var4", 2), 
      new DecisionVariable("Var5", 5), 
     }; 

nhưng tôi muốn tạo ra chúng bằng một Đối với loop:

 DecisionVariable[] attributes = 
     { 
      for (int i=0;i<49;i++) 
      { 
       new DecisionVariable ("Var" + i, iValues[i]); 
      } 
     }; 

Trong thứ hai phiên bản C# nói với tôi rằng " Đối với "có biểu thức không hợp lệ.

Tôi có lỗi đánh máy ở đâu đó hoặc là một cái gì đó như vậy thường không được phép, sử dụng vòng lặp for trong một hàm tạo không?

+0

Thats vì bạn có vòng lặp của bạn trong bộ khởi tạo. –

+0

Khởi tạo mảng đầu tiên và sau đó thực hiện vòng lặp for để thêm các mục trong mảng. –

Trả lời

12

Bạn không thể sử dụng vòng lặp for bên trong một collection initializer. Sử dụng mã này để thay thế:

DecisionVariable[] attributes = new DecisionVariable[49]; 
for (int i = 0; i < 49; i++) 
    attributes[i] = new DecisionVariable ("Var" + i, iValues[i]); 
+0

+1 Câu trả lời hay hơn. Trong khi tôi yêu phương pháp 'LINQ' và' Phạm vi', kiểu dáng của vòng lặp 'for' đơn giản trông có vẻ là tốt. –

+0

@IlyaIvanov: Tôi là một fan hâm mộ lớn của LINQ, nhưng nó không phải lúc nào cũng là công cụ thích hợp cho công việc. –

+0

@DanielHilgarth, bạn có thể vui lòng giải thích ** tại sao không ** sử dụng LINQ để tạo mảng này? –

3
DecisionVariable[] attributes = new DecisionVariable[49]; 

    for (int i=0; i<49; i++) 
    { 
     attributes[i] = new DecisionVariable("Var" + i, iValues[i]); 
    } 

Bạn cũng có thể sử dụng generics và làm:

List<DecisionVariable> attributes = new List<DecisionVariable>(); 

    for (int i=0; i<49; i++) 
    { 
     attributes.Add(new DecisionVariable("Var" + i, iValues[i])); 
    } 
3

Bạn có thể sử dụng cú pháp LINQ để làm điều này:

DecisionVariable[] attributes = 
         Enumerable. 
         Range(0, 49). 
         Select(i => new DecisionVariable("Var" + i, iValues[i])). 
         ToArray(); 
+0

Lưu ý: tham số thứ hai của 'Phạm vi()' là ** đếm ** (không phải giá trị kết thúc). –

+0

@SergeyBrunov - vâng, tất nhiên, cảm ơn. Thay đổi trở lại 49. – Yakimych

1

Đó là thuận lợi để sử dụng Enumerable.Range Method:

DecisionVariable[] attributes = Enumerable 
    .Range(0, 49) 
    .Select(i => new DecisionVariable("Var" + i, iValues[i])) 
    .ToArray(); 

Nếu mảng iValuescùng một số yếu tố bạn cùng muốn làm cho các mảng attributes sau đó xem xét đoạn mã sau:

DecisionVariable[] decisionVariables = iValues 
    .Select((value, index) => new DecisionVariable("Var" + index, value)) 
    .ToArray(); 
+0

Truy vấn thứ hai của bạn sẽ không trả về cùng một kết quả, mà đúng hơn là được sắp xếp theo cùng cách với mảng 'iValues' (không có gì' OrderBy' sẽ không xử lý;)). – Yakimych

0

Bạn có thể làm một cái gì đó như thế này.

Class1[] c1 = new Class1[12]; 
for (int i = 0; i < 12; i++) 
{ 
     c1[i] = new Class1(i); 
} 
+0

-1: 'c' phải làm gì? –

+0

Đó là do nhầm lẫn được thêm vào. –

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