它是一个LINQ结果的事实可能与这个问题无关,但无论如何我都提到它 - 因为这是导致这个问题的背景。
我运行LINQ查询。结果是;
IEnumerable<MyClass>
我想将结果放入ObservableCollection;
ObservableCollection<MyClass>
我该怎么做演员? (没有运行IEnumerable并将元素复制到ObservableCollection)。我注意到LINQ有一些To ...()函数,但它似乎没有帮助我这个演员..?
答案 0 :(得分:97)
只需使用:
ObservableCollection<Foo> x = new ObservableCollection<Foo>(enumerable);
这将进行所需的复制。没有办法观察实时查询的变化 - 尽管ObservableQuery<T>
的想法是一个有趣的(虽然具有挑战性)。
如果你想要一个扩展方法来做到这一点,那很简单:
public static ObservableCollection<T> ToObservableCollection<T>
(this IEnumerable<T> source)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
return new ObservableCollection<T>(source);
}
答案 1 :(得分:13)
var linqResults = foos.Where(f => f.Name == "Widget");
var observable = new ObservableCollection<Foo>(linqResults);
答案 2 :(得分:10)
您可以使用ObservableCollection
constructor:
ObservableCollection<MyClass> obsCol =
new ObservableCollection<MyClass>(myIEnumerable);
答案 3 :(得分:0)
IEnumerable只是界面。
您需要将IEnumerable中的内容复制到ObservableCollection中。您可以通过在创建新的IEnumerable时将其传递给ObersvableCollection的构造函数来实现此目的
答案 4 :(得分:0)
几年前我写了这个图书馆。
https://github.com/wasabii/OLinq
它并不能完全满足您的需求,它可以提供更多功能。它是一个Linq查询提供程序,它解析表达式树,附加到引用的集合,并公开另一个在更改时发出事件的集合。
缺少一些Linq运营商。但代码库并不难扩展。
答案 5 :(得分:0)
您可能需要我的ObservableComputations库。这是用于通过INotifyPropertyChanged和INotifyColectionChanged(ObservableCollection)对象进行计算的.NET API。计算结果是INotifyPropertyChanged和INotifyColectionChanged(ObservableCollection)对象。