随机示例:
ConfigurationElementCollection
.Net 有大量这些WhateverCollection
没有实现IEnumerable<T>
的小类,这意味着我不能使用 Linq 来使用它们开箱即用的对象。甚至在 Linq 之前,你会认为他们会想要使用泛型(我相信在 C# 2 中一直引入)
似乎我一直在遇到这些烦人的小集合类型。有什么技术原因吗?
随机示例:
ConfigurationElementCollection
.Net 有大量这些WhateverCollection
没有实现IEnumerable<T>
的小类,这意味着我不能使用 Linq 来使用它们开箱即用的对象。甚至在 Linq 之前,你会认为他们会想要使用泛型(我相信在 C# 2 中一直引入)
似乎我一直在遇到这些烦人的小集合类型。有什么技术原因吗?
答案在问题标题中:“命名集合”。这是在泛型可用之前您必须使集合类型安全的方式。其中有很多可以追溯到 .NET 1.x 的代码,尤其是 Winforms。没有合理的方法来使用泛型重写它们,这会破坏太多现有代码。
因此,命名集合类型是类型安全的,但问题是 System.Collections.IEnumerator.Current,它是 Object 类型的属性。您可以使用 OfType() 或 Cast() 对这些集合进行 Linqify。
正如 Adam Houldsworth 在评论中所说,您只需要使用 Cast<> 方法。
例子:
var a = new DogCollection();
var allFidos = a.Cast<Dog>().Where(d => d.Name == "Fido");