何らかの理由でデータ構造をカプセル化し、その機能の限定されたサブセットを提供する必要がない限り、私は通常、リストを直接使用するという陣営にいます。これは主に、カプセル化の特別な必要性がない場合、それを行うのは時間の無駄だからです。
ただし、C#3.0の集計初期化機能では、カスタマイズされたコレクションクラスを使用することを推奨する新しい状況がいくつかあります。
基本的に、C#3.0ではIEnumerable
、Addメソッドを実装し、持つすべてのクラスで、新しい集計初期化子構文を使用できます。たとえば、DictionaryはメソッドAdd(K key、V value)を定義しているため、次の構文を使用してディクショナリを初期化できます。
var d = new Dictionary<string, int>
{
{"hello", 0},
{"the answer to life the universe and everything is:", 42}
};
この機能の優れている点は、任意の数の引数を持つaddメソッドで機能することです。たとえば、次のコレクションがあるとします。
class c1 : IEnumerable
{
void Add(int x1, int x2, int x3)
{
//...
}
//...
}
次のように初期化することが可能です。
var x = new c1
{
{1,2,3},
{4,5,6}
}
これは、複雑なオブジェクトの静的テーブルを作成する必要がある場合に非常に役立ちます。たとえば、使用List<Customer>
しているだけで、顧客オブジェクトの静的リストを作成したい場合は、次のように作成する必要があります。
var x = new List<Customer>
{
new Customer("Scott Wisniewski", "555-555-5555", "Seattle", "WA"),
new Customer("John Doe", "555-555-1234", "Los Angeles", "CA"),
new Customer("Michael Scott", "555-555-8769", "Scranton PA"),
new Customer("Ali G", "", "Staines", "UK")
}
ただし、次のようなカスタマイズされたコレクションを使用する場合:
class CustomerList : List<Customer>
{
public void Add(string name, string phoneNumber, string city, string stateOrCountry)
{
Add(new Customer(name, phoneNumber, city, stateOrCounter));
}
}
次に、次の構文を使用してコレクションを初期化できます。
var customers = new CustomerList
{
{"Scott Wisniewski", "555-555-5555", "Seattle", "WA"},
{"John Doe", "555-555-1234", "Los Angeles", "CA"},
{"Michael Scott", "555-555-8769", "Scranton PA"},
{"Ali G", "", "Staines", "UK"}
}
これには、各要素の要素タイプ名を再入力する必要がないため、入力が簡単で読みやすいという利点があります。要素タイプが長い場合や複雑な場合は、この利点が特に強くなります。
そうは言っても、これは、アプリで定義されたデータの静的コレクションが必要な場合にのみ役立ちます。コンパイラなどの一部の種類のアプリは、常にそれらを使用します。他の、典型的なデータベースアプリのように、データベースからすべてのデータをロードするため、そうではありません。
私のアドバイスは、オブジェクトの静的コレクションを定義する必要がある場合、またはコレクションインターフェイスをカプセル化する必要がある場合は、カスタムコレクションクラスを作成することです。それ以外の場合は、直接使用List<T>
します。