2013-01-09 13 views
12

a caso ad esempio:Perché così tante collezioni di nome in .NET non implementare IEnumerable <T>?

ConfigurationElementCollection 

Net ha tonnellate di questi piccoli WhateverCollection classi che non implementano IEnumerable<T>, il che significa che non posso usare LINQ to Objects con loro fuori dalla scatola. Anche prima di Linq, penseresti che avrebbero voluto fare uso di generici (che sono stati introdotti fino in C# 2 credo)

Sembra che mi imbatti in questi fastidiosi tipi di raccolta tutto il tempo. C'è qualche motivo tecnico?

+19

Essi sono stati introdotti prima generici erano disponibili. –

+4

È tecnicamente possibile utilizzare LINQ "fuori dalla scatola" utilizzando '' OfType' o Cast' se la raccolta tende a contenere un tipo forte, purché almeno implementa 'IEnumerable' (non generico). 'OfType' /' Cast' produrre generici IEnumerable '' casi, e apre così il resto degli operatori LINQ. –

+0

E molto tempo fa dall'ultimo utilizzo di ArrayList. – deerchao

risposta

7

La risposta è nel titolo domanda: "collezioni di nome". Qual è il modo in cui hai dovuto rendere sicure le raccolte prima che i generici diventassero disponibili. Ce ne sono molti nel codice che risale a .NET 1.x, in particolare Winforms. Non c'era un modo ragionevole per riscriverli usando i generici, che avrebbero rotto troppi codici esistenti.

Così il tipo di raccolta denominata È SICURO tipo, ma il guaio è System.Collections.IEnumerator.Current, una proprietà di tipo Object. Puoi Linqificare queste raccolte usando OfType() o Cast().

1

Come Adamo Houldsworth detto in un commento già, è sufficiente utilizzare il cast <> metodo.

Esempio:

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