【问题标题】:Cast LINQ result to ObservableCollection将 LINQ 结果转换为 ObservableCollection
【发布时间】:2009-09-23 10:53:10
【问题描述】:

它是 LINQ 结果这一事实可能与该问题无关,但我还是要提到它——因为这是导致该问题的上下文。

我运行 LINQ 查询。结果是;

IEnumerable<MyClass> 

我想将结果放入 ObservableCollection;

ObservableCollection<MyClass> 

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

【问题讨论】:

标签: c# linq casting


【解决方案1】:

只需使用:

ObservableCollection<Foo> x = new ObservableCollection<Foo>(enumerable);

这将完成所需的复制。无法观察实时查询的变化 - 尽管ObservableQuery&lt;T&gt; 的想法很有趣(尽管具有挑战性)。

如果你想要一个扩展方法来做到这一点,很简单:

public static ObservableCollection<T> ToObservableCollection<T>
    (this IEnumerable<T> source)
{
    if (source == null)
    {
        throw new ArgumentNullException("source");
    }
    return new ObservableCollection<T>(source);
}

【讨论】:

  • 现在有人如何在 Silverlight 3.0 中实现这一点,其中只有默认的 new ObservableCollection() 构造函数可用?
  • 不幸的是,如果您想将结果复制到已经被 ReadOnlyObservableCollection 包装的 ObservableCollection 中,因为 ReadOnlyObservableCollection 无法重新绑定到新集合,所以这并没有多大用处。在这种情况下,您似乎无法使用 foreach 循环并一次复制一个元素。
  • @Neutrino:我认为这是与当时问题中提出的问题不同的问题。这是一个有效的问题,我只是不认为这是 OP 的问题。
  • 我同意。我并不是说您的帖子没有回答最初的问题,只是希望有人对 ReadOnlyObservableCollection 问题有想法。
【解决方案2】:
var linqResults = foos.Where(f => f.Name == "Widget");

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

【讨论】:

    【解决方案3】:

    您可以为此使用ObservableCollection constructor

    ObservableCollection<MyClass> obsCol = 
            new ObservableCollection<MyClass>(myIEnumerable);
    

    【讨论】:

      【解决方案4】:

      IEnumerable 只是接口。

      您需要将 IEnumerable 中的内容复制到 ObservableCollection 中。您可以通过在创建新的时将 IEnumerable 传递给 ObersvableCollection 的构造函数来做到这一点

      【讨论】:

        【解决方案5】:

        你可能需要我的ObservableComputations 库。那是用于计算 INotifyPropertyChanged 和 INotifyColectionChanged (ObservableCollection) 对象的 .NET API。计算结果是 INotifyPropertyChanged 和 INotifyColectionChanged (ObservableCollection) 对象。

        【讨论】:

          【解决方案6】:

          几年前我写了这个库。

          https://github.com/wasabii/OLinq

          它并没有完全按照您的意愿做,它做得更多。它是一个 Linq 查询提供程序,它解析表达式树,附加到引用的集合,并公开另一个在更改时发出事件的集合。

          它缺少一些 Linq 运算符。但是代码库并不难扩展。

          【讨论】:

          • 我也一直在为它维护 NuGet 包。 nuget.org/packages/OLinq
          • 我想使用你的包,但自述文件中提供的示例不起作用,Where 之后对ToObservableView 的调用未知
          • 不确定自述文件。以前好像有人把它搞砸了。 .Where 返回一个 IQueryable。但实际对象是 ObservableQuery。我有一个 .AsObservableQuery() 方法来做演员。 >collection.AsObservableQuery().Where(i => i > 2).AsObservableQuery().ToObservableView() 与 .AsEnumerable 和 AsParallelQuery 以及所有其他类似。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-05
          • 1970-01-01
          • 2010-10-31
          • 2011-06-20
          相关资源
          最近更新 更多