2010-02-02 33 views
19

Tôi có một ObservableCollection và tôi muốn đặt nội dung của IList thành cái này. Bây giờ tôi chỉ có thể tạo ra một thể hiện mới của bộ sưu tập ..:Thêm các phần tử từ IList vào ObservableCollection

public ObservableCollection<Bar> obs = new ObservableCollection<Bar>(); 
public void Foo(IList<Bar> list) 
{ 
    obs = new ObservableCollection<Bar>(list); 
} 

Nhưng làm thế nào tôi có thể thực sự mang nội dung của IList và thêm nó vào ObservableCollection hiện tại của tôi? Tôi có phải lặp qua tất cả các yếu tố hay không, có cách nào tốt hơn không?

public void Foo(IList<Bar> list) 
{ 
    foreach (var elm in list) 
     obs.Add(elm); 
} 

Trả lời

39

Bạn có thể làm

public void Foo(IList<Bar> list) 
{ 
    list.ToList().ForEach(obs.Add); 
} 

hoặc như là một phương pháp khuyến nông,

public static void AddRange<T>(this ObservableCollection<T> collection, IEnumerable<T> items) 
    { 
     items.ToList().ForEach(collection.Add); 
    }  
+0

Thx! Đã đi với phương pháp ToList.ForEach bây giờ. Sẽ xem xét phương pháp mở rộng nếu tôi cần nhiều hơn một nơi. – stiank81

+0

Phương thức mở rộng 'Enumerable.ToList' không cần phân bổ một' Danh sách 'mới. Tôi có lẽ muốn giới thiệu câu trả lời của RaYell. –

+3

@Richard - đó là sự thật mặc dù dưới mui xe này danh sách mới (danh sách) - mà gọi nội bộ ((ICollection ) danh sách) .CopyTo (T [)) trong hầu hết các triển khai của IList (ví dụ: Danh sách ) cuộc gọi một bản sao mảng (bên ngoài) chức năng bản sao. điều này sẽ khá hiệu quả và chỉ liên quan đến (tối đa) bản sao nguyên tử của các tài liệu tham khảo cần thiết thay vì lặp lại các thành viên. –

1

Looping là cách duy nhất, vì không có AddRange tương đương cho ObservableCollection.

8

Bạn có thể viết phương thức mở rộng của riêng mình nếu bạn đang sử dụng C# 3 + để trợ giúp bạn. Mã này đã có một số thử nghiệm cơ bản để đảm bảo rằng nó hoạt động:

public static void AddRange<T>(this ObservableCollection<T> coll, IEnumerable<T> items) 
{ 
    foreach (var item in items) 
    { 
     coll.Add(item); 
    } 
} 
+0

+1 cho ý tưởng phương pháp mở rộng –

+1

Dự án [Prism] (http://compositewpf.codeplex.com/) của Microsoft cho WPF bao gồm một phương thức mở rộng tương tự (mặc dù, phiên bản của họ trả về bộ sưu tập chứ không phải là 'void', để hỗ trợ phương pháp chuỗi). Chỉ cần tham khảo Microsoft.Practices.Composite.dll và thêm 'bằng cách sử dụng Microsoft.Practices.Composite;'. – totorocat

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