2013-01-09 8 views
12

Rzadki przykład:Dlaczego tak wiele nazwanych kolekcji w .NET nie implementuje IEnumerable <T>?

ConfigurationElementCollection 

Net ma mnóstwo tych małych WhateverCollection klas, które nie wdrażają IEnumerable<T>, co oznacza, że ​​nie można użyć LINQ do obiektów z nich po wyjęciu z pudełka. Nawet przed Linq, moglibyście pomyśleć, że chcieliby użyć generycznych (które zostały wprowadzone w C# 2, jak sądzę).

Wygląda na to, że przez cały czas przeszukuję te irytujące małe kolekcje. Czy jest jakiś techniczny powód?

+19

zostały wprowadzone wcześniej generyczne były dostępne. –

+4

Możesz technicznie używać LINQ "po wyjęciu z pudełka", używając 'OfType' lub' Cast' jeśli kolekcja ma tendencję do zawierania silnego typu, o ile przynajmniej implementuje 'IEnumerable' (nietypowy). 'OfType' /' Cast' generuje wydajne 'IEnumerable ' instancje, a tym samym otwiera pozostałe operatory LINQ. –

+0

I od dawna używam ArrayList. – deerchao

Odpowiedz

7

Odpowiedź znajduje się w tytule pytania: "nazwane kolekcje". W ten sposób trzeba było stworzyć kolekcje, które będą bezpieczne, zanim pojawią się leki generyczne. Jest ich dużo w kodzie, który pochodzi z .NET 1.x, szczególnie WinForm. Nie było rozsądnego sposobu na przepisanie ich za pomocą generycznych, które zepsułyby zbyt wiele istniejącego kodu.

Tak nazwany typ kolekcji jest bezpieczny, ale pocieranie to System.Collections.IEnumerator.Current, właściwość typu Object. Możesz Linqify te kolekcje za pomocą OfType() lub Cast().

1

Jak już powiedział Adam Houldsworth w komentarzu, wystarczy użyć metody Cast <>.

przykład:

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