【问题标题】:Why do so many named collections in .NET not implement IEnumerable<T>?为什么 .NET 中这么多命名集合没有实现 IEnumerable<T>?
【发布时间】:2013-01-09 15:20:42
【问题描述】:

随机示例:

ConfigurationElementCollection

.Net 有大量没有实现IEnumerable&lt;T&gt; 的小WhateverCollection 类,这意味着我不能使用Linq 来处理开箱即用的对象。 甚至在 Linq 之前,您可能会认为他们会想要使用泛型(我相信它是在 C# 2 中一直引入的)

似乎我总是遇到这些烦人的小集合类型。 有什么技术原因吗?

【问题讨论】:

  • 它们是在泛型可用之前引入的。
  • 如果集合倾向于包含强类型,您可以通过使用OfTypeCast 从技术上“开箱即用”使用LINQ,只要它至少实现IEnumerable(非-通用的)。 OfType/Cast 产生通用 IEnumerable&lt;T&gt; 实例,从而打开其余的 LINQ 运算符。
  • 自从我上次使用 ArrayList 已经很久了。
  • @EricJ:当然泛型在 1.0 中不可用。但真正的问题是:“为什么 BCL 团队没有在 .NET 2.0 中为这些类添加通用接口?”。
  • 也许这将是一个重大变化,尤其是在序列化/反序列化方面。

标签: c# ienumerable


【解决方案1】:

答案在问题标题中:“命名集合”。这是在泛型可用之前您必须使集合类型安全的方式。其中有很多可以追溯到 .NET 1.x 的代码,尤其是 Winforms。没有合理的方法可以使用泛型重写它们,否则会破坏太多现有代码。

因此,命名集合类型是类型安全的,但问题是 System.Collections.IEnumerator.Current,它是 Object 类型的属性。您可以使用 OfType() 或 Cast() 对这些集合进行 Linqify。

【讨论】:

    【解决方案2】:

    正如 Adam Houldsworth 在评论中所说,您只需要使用 Cast 方法。

    例子:

    var a = new DogCollection();
    var allFidos = a.Cast<Dog>().Where(d => d.Name == "Fido"); 
    

    【讨论】:

      猜你喜欢
      • 2011-04-04
      • 2011-07-29
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 2013-12-06
      相关资源
      最近更新 更多