2013-01-09 2 views
12

Zufall Beispiel:Warum implementieren so viele benannte Auflistungen in .NET IEnumerable <T> nicht?

ConfigurationElementCollection 

.Net Tonnen dieser kleinen WhateverCollection Klassen hat, die nicht IEnumerable<T> implementieren, was bedeutet, dass ich nicht Linq zu Objekten mit ihnen aus der Box verwenden kann. Schon vor Linq, würden Sie denken, dass sie Generika verwenden wollten (die in C# 2 eingeführt wurden, glaube ich)

Es scheint, dass ich die ganze Zeit über diese lästigen kleinen Sammlungstypen rennen. Gibt es einen technischen Grund?

+19

sie eingeführt wurden, bevor Generika zur Verfügung standen. –

+4

Sie können LINQ "out of the box" technisch verwenden, indem Sie 'OfType' oder' Cast' verwenden, wenn die Sammlung tendenziell einen starken Typ enthält, solange mindestens 'IEnumerable' (nicht-generisch) implementiert wird. 'OfType' /' Cast' liefert generische 'IEnumerable ' Instanzen und öffnet damit den Rest der LINQ-Operatoren. –

+0

Und lange seit ich ArrayList zum letzten Mal benutze. – deerchao

Antwort

7

Die Antwort ist in der Frage Titel: "benannte Sammlungen". So mussten Sie die Sammlungen typsicher machen, bevor Generika verfügbar wurden. Es gibt eine Menge von ihnen in Code, der auf .NET 1.x zurückgeht, besonders Winforms. Es gab keinen vernünftigen Weg, sie mit Hilfe von Generika umzuschreiben, die zu viel vorhandenen Code zerstört hätten.

So ist der benannte Sammlertyp typsicher, aber das reiben ist System.Collections.IEnumerator.Current, eine Eigenschaft des Typs Object. Sie können diese Auflistungen mit OfType() oder Cast() verknüpfen.

1

Wie Adam Houldsworth bereits in einem Kommentar gesagt hat, müssen Sie einfach die Cast <> Methode verwenden.

Beispiel:

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