I have an ObservableCollection, and I\'d like to set the content of an IList to this one. Now I could just create a new instance of the collection..:
public
You could do
public void Foo(IList<Bar> list)
{
list.ToList().ForEach(obs.Add);
}
or as an extension method,
public static void AddRange<T>(this ObservableCollection<T> collection, IEnumerable<T> items)
{
items.ToList().ForEach(collection.Add);
}
Here is an descendant to ObservableCollection<T>
to add a message efficient AddRange
, plus unit tests:
ObservableCollection Doesn't support AddRange method, so I get notified for each item added, besides what about INotifyCollectionChanging?
If you do want to instantiate an observable collection and want to add a new range into Observable collection you can follow the following method I have tried:
var list = new List<Utilities.T>();
list.AddRange(order.ItemTransactions.ToShortTrans());
list.AddRange(order.DealTransactions.ToShortTrans());
ShortTransactions = new ObservableCollection<T>(list);
in this way you can add the range into ObservableCollection without looping.
Looping is the only way, since there is no AddRange
equivalent for ObservableCollection
.
You could write your own extension method if you are using C#3+ to help you with that. This code has had some basic testing to ensure that it works:
public static void AddRange<T>(this ObservableCollection<T> coll, IEnumerable<T> items)
{
foreach (var item in items)
{
coll.Add(item);
}
}
There is a library that solves this problem. It contains an ObservableList that can wrap a List. It can be used in the following way:
List<Bar> currentList = getMyList();
var obvList = new ObservableList<Bar>(currentList);
https://github.com/gsonnenf/Gstc.Collections.ObservableLists