2009-09-23 63 views
53

它是LINQ结果的事实可能与该问题无关,但无论如何我都会提及 - 因为这是导致此问题的上下文。将LINQ结果转换为ObservableCollection

我运行一个LINQ查询。结果是一个;

IEnumerable<MyClass> 

我想把结果放到一个ObservableCollection中;

ObservableCollection<MyClass> 

我该如何操作? (无需运行IEnumerable并将元素复制到ObservableCollection)。我注意到LINQ已经有了几个To ..()函数,但它似乎并没有帮助我完成这个演员..?

回答

91

只需使用:

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); 
} 
+4

任何人现在如何在Silverlight 3.0中实现此目标,其中只有默认的新ObservableCollection ()构造函数可用? – 2009-12-02 10:43:38

+0

不幸的是,如果您想将结果复制到已经由ReadOnlyObservableCollection包装的ObservableCollection中,因为ReadOnlyObservableCollection无法被重新绑定到新的集合,所以没有什么用处。在这种情况下,你似乎坚持使用foreach循环并一次拷贝一个元素。 – Neutrino 2014-01-21 17:12:28

+0

@Neutrino:我认为那是一个与当时问题中提出的问题不同的问题。这是一个有效的问题,我只是不认为它是OP所拥有的。 – 2014-01-21 17:15:47

10

您可以使用ObservableCollectionconstructor此:

ObservableCollection<MyClass> obsCol = 
     new ObservableCollection<MyClass>(myIEnumerable); 
13
var linqResults = foos.Where(f => f.Name == "Widget"); 

var observable = new ObservableCollection<Foo>(linqResults); 
0

IEnumerable的仅仅是接口。

您需要将IEnumerable中的内容复制到ObservableCollection中。您可以通过将IEnumerable传递给ObersvableCollection的构造函数来创建新文件。

0

我几年前编写了这个库。

https://github.com/wasabii/OLinq

它不会做的正是你可能想要的东西,但它更多。它是一个Linq查询提供程序,用于解析表达式树,附加到引用的集合,并公开另一个集合,该集合在发生更改时发出事件。

它缺少一些Linq运营商。但是代码库不难扩展。

+0

我也一直在为它维护NuGet包。 HTTPS://www.nuget。org/packages/OLinq/ – wasabi 2015-03-01 18:00:56

+0

我想使用你的软件包,但自述文件中提供的例子不起作用,在'Where'之后对'ToObservableView'的调用是未知的 – 2016-04-18 12:53:00

+1

对README的不确定。看起来有人在过去把它弄糟了。 。返回一个IQueryable。但实际的对象是一个ObservableQuery。我有一个.AsObservableQuery()方法来执行强制转换。 ().AsObservableQuery()。ToObservableView() 与.AsEnumerable和AsParallelQuery以及所有其他类型不同。 – wasabi 2016-04-19 17:02:21