【问题标题】:Union two ObservableCollection Lists联合两个 ObservableCollection 列表
【发布时间】:2010-12-06 14:56:22
【问题描述】:

我有两个 ObservableCollection 列表,我想合并它们。我天真的方法是使用 Union - 方法:

ObservableCollection<Point> unitedPoints = observableCollection1.Union(observableCollection2);

ObservableCollection1/2 也是 ObservableCollection 类型。但是编译器会为这一行抛出以下错误:

“System.Collections.Generic.IEnumerable”类型无法隐式转换为“System.Collections.ObjectModel.ObservableCollection”。已存在显式转换。 (可能缺少转换)

(措辞可能不准确,因为我是从德语翻译过来的)。

任何人都知道,如何合并两个 ObservableCollection 并获得 ObservableCollection 作为结果?

提前致谢, 弗兰克

Edith 说:我刚刚意识到有必要提及我开发了一个 Silverlight-3-Application,因为“ObservableCollection”类在 SL3 和 .NET3.0 场景中有所不同。

【问题讨论】:

    标签: c# silverlight collections


    【解决方案1】:

    LINQ Union 扩展方法返回一个 IEnumerable。您需要枚举每个项目并将其添加到结果集合中:-

    var unitedPoints = new ObservableCollection<Point> ();
    foreach (var p in observableCollection1.Union(observableCollection2))
       unitedPoints.Add(p);
    

    如果你想要一个 ToObservableCollection,那么你可以这样做:

    public static class MyEnumerable
    {
        public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> source)
        {
            var result = new ObservableCollection<T> ();
            foreach (var item in source)
               result.Add(item);
            return result;
        }
     }
    

    现在你的行是:

    var unitedPoints = observableCollection1.Union(observableCollection2).ToObservableCollection();
    

    【讨论】:

    • 不错的答案 - 但您的意思是 foreach,而不是 'for'?
    • 哎呀,是的,foreach,在 javascript 和 C# 之间来回切换会为你做到这一点。
    • uh .. javascript ... 来自具有明确声明的类型安全世界... 在处理 Javascript 大约一个小时后,我感到很脏 g
    • 您可以在 ToObservableCollection 方法上为自己节省一些代码 :) return new ObservableCollection(source);
    • @JustEngland:在 Silverlight 4 中可以,但 Silverlight 3 没有该构造函数。
    【解决方案2】:

    你想合并现有的内容,但基本上有独立的列表?如果是这样,那就相对容易了:

    ObservableCollection<Point> unitedPoints = new ObservableCollection<Point>
        (observableCollection1.Union(observableCollection2).ToList());
    

    但是,如果您想要一个可观察的集合,它实际上是对其他人的“视图”,我不确定最好的方法...

    【讨论】:

    • 我已经尝试过了,但是 ObservableCollection 的构造函数没有接受参数的重载……然后我意识到 Silverlight 中的 ObservableCollection 与 .NET 3.0 中的 OberservableCollection 不同。什么?我认为我可以在 Silverlight 中使用桌面应用程序中的相同类?当即使这样的基本类在两种情况下都不同时,这应该如何工作?他们怎么会考虑给不同的课程起相同的名字呢?这绝对是奇怪的。还有什么作用有点不同于...
    • 你确定它们实际上是不同的类吗?还是只是 Silverlight 版本缺少一些方法/构造函数?
    • @aaginor:Silverlight 实现与标准 .NET 库的许多共同点通常都得到了相当大的简化。当使用我们已经熟悉的东西时,不得不重新检查他们的文档是非常令人恼火的。尤其令人恼火的是 SL3 文档仍然只是 chm(或在线)形式:(
    • @Jon:恕我直言,它们是不同的,即使只缺少一个方法/构造函数/属性。关键是(这是我非常兴奋的一个),似乎我可以使用我所有的 .NET-3.0 类(有例外,是的,但那是“合乎逻辑”的,就像没有 Windows.Forms 一样)和在 Silverlight 中使用它们。现在我总是要问我“它们会以同样的方式工作吗?也许有一个小的差异 - 由于这种差异,我的代码正在变得错误?也许差异是这样的,编译器不会抛出一个错误……”
    • @Anthony:.NET3.0 和 SL3 之间是否有某种比较列表?诸如白名单之类的东西,所以我可以告诉使用哪些类而不必担心会中断,有差异的灰名单(如 ObservableCollection)和黑名单(如 HashSet)......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多