2010-02-02 58 views
19

我有一個ObservableCollection,並且我想將IList的內容設置爲這個元素。現在,我可以創建集合的新實例..:從IList添加元素到ObservableCollection

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

但我怎麼能採取實際的IList的內容並把它添加到現有的ObservableCollection?我是否需要遍歷所有元素,還是有更好的方法?

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

回答

39

你可以做

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

或作爲一個擴展方法,

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

Thx!現在就開始使用ToList.ForEach方法。如果我需要這個不止一個地方,請考慮擴展方法。 – stiank81 2010-02-02 13:35:56

+0

'Enumerable.ToList'擴展方法不必要地分配一個新的'List '。我可能會推薦RaYell的答案。 – 2010-02-02 13:58:35

+3

@理查德 - 儘管在這種情況下,它會執行新列表(列表) - 內部調用((ICollection )列表).CopyTo(T [])在IList (例如列表)的大多數實現中調用本地(外部)數組複製功能。這應該是非常有效的,並且只涉及(至多)必要參考的原子副本,而不是迭代成員。 – 2010-02-02 18:15:30

1

循環是唯一的辦法,因爲沒有AddRange等效ObservableCollection

8

如果您使用C#3 +來幫助您,那麼您可以編寫自己的擴展方法。此代碼已經有了一些基本的測試,以確保它的工作原理:

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

+1爲擴展方法的想法 – 2010-02-02 13:10:46

+1

微軟的[Pri​​sm](http://compositewpf.codeplex.com/)項目爲WPF包括一個類似的擴展方法(雖然,他們的版本返回集合,而不是'void',以支持方法鏈接)。 只需引用Microsoft.Practices.Composite.dll並添加'using Microsoft.Practices.Composite;'。 – totorocat 2010-10-15 02:27:11