我通常只是直接使用 List 的阵营,除非出于某种原因我需要封装数据结构并提供其功能的有限子集。这主要是因为如果我没有特定的封装需求,那么这样做只是浪费时间。
但是,使用 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}
};
该功能的伟大之处在于它适用于带有任意数量参数的添加方法。例如,给定这个集合:
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>
。