我一般都是直接使用List的阵营,除非由于某些原因,我需要封装数据结构并提供其功能的有限子集。这主要是因为如果我没有特别的封装需求,那么这样做只是浪费时间。
但是,使用C#3.0中的聚合初始化功能,我会提倡使用自定义集合类的一些新情况。
基本上,C#3.0允许任何类实现IEnumerable
,并有一个Add方法来使用新的聚集初始值设定语法。例如,因为字典定义的方法添加(K键,V值),可以初始化一个字典使用此语法:
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>
。
您可以将LoadAll()作为从列表挂起的扩展方法来执行。这会给你LoadAll()每个列表/集合,它可以从任何IEnumerable 读入......有些人可能会说这是滥用扩展方法。但我说它允许你像多重继承一样行事。 –
2009-07-17 18:00:19
好主意,虽然我的LoadAll()方法并不是真正的通用。它根据基础对象类型从不同的表中加载。一般来说,可能有办法做到这一点,但目前我还没有真正考虑过这一点。 – jeremcc 2009-07-24 16:35:08