2013-01-09 22 views
12

ランダム例:なぜ.NETの名前付きコレクションにIEnumerable <T>が実装されていないのですか?

ConfigurationElementCollection 

.NETは私が箱から出して彼らとオブジェクトへのLINQを使用することはできませんを意味し、IEnumerable<T>を実装していないこれらのほとんどのWhateverCollectionクラスのトンを持っています。 Linqの前であっても、ジェネリックスを使いたいと思っていたでしょう(私は信じているC#2に戻ってきました)

私はこれらの厄介な小さなコレクションタイプを常に走っているようです。 技術的な理由はありますか?

+19

ジェネリック医薬品が利用できた前に彼らが導入されました。 –

+4

少なくともIEnumerable(非ジェネリック)を実装している限り、コレクションが強い型を含む傾向がある場合は、OfTypeまたはCastを使用してLINQを技術的に使用できます。 'OfType' /' Cast'はジェネリックな 'IEnumerable 'インスタンスを生成し、残りのLINQ演算子を開きます。 –

+0

そして、私はArrayListを最後に使用して以来長い間続いてきました。 – deerchao

答えて

7

答えは質問タイトル:「名前付きコレクション」です。これは、ジェネリックが利用可能になる前にコレクションを型保証する必要があった方法です。 .NET 1.x、特にWinformsにまでさかのぼるコードには、多くのものがあります。ジェネリックスを使用してそれらを書き直す合理的な方法はありませんでした。既存のコードがあまりにも壊れてしまっていました。

したがって、名前付きコレクションの型は型保護されていますが、rubはSystem.Collections.IEnumerator.Currentです。これはObject型のプロパティです。 OfType()またはCast()を使用してこれらのコレクションをLinqifyできます。

1

Adam Houldsworthがコメントですでに述べたように、キャスト<>メソッドを使用するだけで済みます。

例:

var a = new DogCollection(); 
var allFidos = a.Cast<Dog>().Where(d => d.Name == "Fido"); 
関連する問題