2013-07-25 27 views
11

Cách tốt nhất để tạo danh sách với số lượng phiên bản tùy ý của cùng một đối tượng là gì? tức là có một cách nhỏ gọn hoặc hiệu quả hơn để thực hiện những điều sau đây không?Tạo danh sách đầy các phiên bản mới của đối tượng

static List<MyObj> MyObjs = Enumerable.Range(0, 100) 
    .Select(i => new MyObj()) 
    .ToList(); 

(Enumerable.Repeat sẽ cung cấp cho tôi tài liệu tham khảo từ mười đến cùng một đối tượng, vì vậy tôi không nghĩ rằng nó sẽ làm việc.)

+7

Tôi không thấy bất kỳ vấn đề với cách tiếp cận hiện tại của bạn ... – Brian

+0

Tôi không nói rằng có một vấn đề .. nó chỉ cảm thấy như một hack. – Arithmomaniac

+2

"nó chỉ cảm thấy như một hack." Tại sao, không phải ở tất cả! Điều này đánh bại một vòng lặp 'for' tay xuống :-) – dasblinkenlight

Trả lời

8

này sẽ không khó để thực hiện như một iterator:

IEnumerable<T> CreateItems<T> (int count) where T : new() { 
    return CreateItems(count,() => new T()); 
} 

IEnumerable<T> CreateItems<T> (int count, Func<T> creator) { 
    for (int i = 0; i < count; i++) { 
     yield return creator(); 
    } 
} 
3

Rõ ràng, câu trả lời là "không". Cảm ơn mọi người!

6

Được chỉnh sửa để phản ánh rằng phương pháp này không hoạt động.

Tôi đã tò mò về nhận xét của bạn về Enumerable.Repeat, vì vậy tôi đã thử nó.

List<object> myList = Enumerable.Repeat(new object(), 100).ToList(); 

Tôi xác nhận rằng tất cả đều chia sẻ cùng một tham chiếu như OP được đề cập.

+2

Bạn đang ghi đè các trường hợp khi bạn thực hiện 'myList [i] = ...'. Tạo một lớp Foo, với một Bar thuộc tính, sau đó thay đổi Bar, bạn sẽ thấy rằng nó thay đổi cho mọi chỉ mục. – cadrell0

+0

@ cadrell0 cảm ơn bạn đã bình luận của bạn. Bạn đúng - tôi đã ném bản thân mình ra khỏi đó. Tôi sẽ để lại câu trả lời của tôi ở đây chỉ là một bài học cho bất kỳ ai khác về những gì không làm. – Gray

2

Không chắc chắn có gì sai với vòng lặp for trong trường hợp này. Ít nhất, chúng ta có thể xác định dung lượng của danh sách. Điều đó có thể không quan trọng đối với 100 đối tượng, nhưng kích thước là tùy ý.

public class MyClass 
{ 
    static int Capacity = 100; 
    static List<MyObj> MyObjs = new List<MyObj>(Capacity); 

    static MyClass() { 
     for(var i = 0; i < Capacity; i++) { 
      MyObjs.Add(new MyObj()); 
     } 
    } 
} 
+1

Sử dụng 'ToList' sử dụng hàm tạo' List (IEnumerable ) 'của danh sách ', mà tôi tin là nhanh hơn một chút so với gọi 'Add' cho mỗi mục. Đó là ít nhất là như nhau. 'Phạm vi' sử dụng vòng lặp' for' trong nội bộ. Giải pháp của bạn là tốt nhất, hiệu suất tương tự, nhưng nhiều mã hơn. – cadrell0

+0

Phương thức .Select nhất thiết phải tạo một kiểu liệt kê mới vì kiểu đã thay đổi từ một int thành MyObj. Nó cũng phải gọi một phương thức nặc danh 100 lần và cuối cùng chuyển đổi tất cả thành một Danh sách . – B2K

+1

http://msdn.microsoft.com/en-us/library/vstudio/9k7k7cf0.aspx Cả Phạm vi và Chọn sử dụng 'trả lại lợi nhuận'. Bởi vì việc thực hiện được hoãn lại đến điểm mà 'ToList' được gọi, kết quả chỉ được liệt kê một lần, điều này xảy ra khi xây dựng danh sách. – cadrell0