将LINQ结果转换为ObservableCollection

时间:2009-09-23 10:53:10

标签: c# linq casting

它是一个LINQ结果的事实可能与这个问题无关,但无论如何我都提到它 - 因为这是导致这个问题的背景。

我运行LINQ查询。结果是;

IEnumerable<MyClass> 

我想将结果放入ObservableCollection;

ObservableCollection<MyClass> 

我该怎么做演员? (没有运行IEnumerable并将元素复制到ObservableCollection)。我注意到LINQ有一些To ...()函数,但它似乎没有帮助我这个演员..?

6 个答案:

答案 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)对象。