2010-12-03 11 views
3

ジェネリックコレクションとさまざまなタイプのリストオブジェクトを保存するにはどうすればよいですか?出来ますか?コレクションとリストは異なる種類のオブジェクトをどのように保存しますか?出来ますか?

コレクションとリストは、さまざまな型を格納する必要がある場合は、あなたが他のすべてのタイプと互換性のあることをタイプであるためにあなたのコレクションを宣言する必要がArrayListの

答えて

1

ジェネリックコレクションの主な利点は、コレクションに保存する正確なタイプを指定でき、ボクシングが不要なことです。

あなたはここにいくつかのオプションがあります。

  • あなたがオブジェクトをパラメータとして取るSystem.Collections名前空間の非ジェネリックコレクションに固執します。
  • タイプオブジェクトのジェネリックコレクションを作成します。これは上記とほぼ同じですが、IEnumerable<T>に存在するすべての拡張メソッドを使用できます。
  • 一般的なインターフェイスの汎用コレクションを作成します。これは、保存するすべてのタイプを実装します。
6

の交換であるため。

例えば、リスト中のMemoryStreamFileStreamの両方を置くために、あなたはList<Stream>がある可能性がありますので:

List<Stream> streams = new List<Stream>(); 
streams.Add(new MemoryStream()); 
streams.Add(new FileStream(...)); 

複数の異なる種類について、あなたは限りList<object>として行く必要がある場合があります。

List<object> objects = new List<object>(); 
objects.Add("hello"); // A String 
objects.Add(5); // An Int32 
objects.Add(new Button()); 
objects.Add(Guid.NewGuid()); 

この場合、値の型の値はボックス化されますが、特定の値型のリストには含まれません。

要素の型固有のメンバーを使用するには、要素が正しい型であることを確認してから型をキャストする必要があります。 isキャスト、またはasで:よく

string maybeString = objects[0] as string; 
if (maybeString != null) 
{ 
    Console.WriteLine("String of length {0}", maybeString.Length); 
} 
+0

私はいつも、「as」を介してタイプをチェックするのが一般に嫌な印象を受けましたか? –

+1

@KyleBaran:はい、一般的には悪い考えです。単一のコレクション内に型を混在させるのは一般的には悪い考えです。しかし時々、それはすべての選択肢の中で最も悪いことです。 –

1

、あなたはリストストア最も一般的な分母にする必要があります。何かを保存したい場合は、List<object>()またはおそらくList<IMyCommonInterface>()が必要です。

しかし、私の経験上、このようなコーディングが見つかった場合は、アーキテクチャーの再検討が必要な場合があります。

おそらく、達成しようとしているソリューションについて説明できますか?

関連する問題