Collection initialization refers to the process of initializing a collection, such as a list or an array, with a set of values at the time of declaration. It allows for the convenient and concise initialization of collections without the need for extensiv
Collection initialization refers to the process of initializing a collection, such as a list or an array, with a set of values at the time of declaration. It allows for the convenient and concise initialization of collections without the need for extensiv
你可以像这样初始化一个数组:\n
int [ ] arr = { 1, 2, 3, 4, 5 };
\n但是List
不允许这样做:\n
Listlist = { 1, 2, 3, 4, 5 };
\n这背后的原因是什么?\n毕竟两者都允许这样做:\n
int [ ] arr = new int [ ] { 1, 2, 3, 4, 5 }; Listlist = new List { 1, 2, 3, 4, 5 };
\n而且为什么不能用LinkedList
做这个?\n
LinkedListll = new LinkedList () { 1, 2, 3 };
\n更新\n谢谢大家。刚刚看到回复。我想选择几个答案,但没让我选择。\n为什么LinkedList有一个Add方法,但需要显式实现呢?这个问题可能会被修复吗?因为当忽视这些问题时,它们可能会导致更大的问题,对吧?
(Collection initialization)问题的出现原因是在使用LinkedList时,无法直接使用集合初始化器。解决方法是通过先将集合初始化器初始化为数组,然后将数组传递给LinkedList的构造函数。
例如,要使用集合初始化器初始化一个LinkedList,可以按照以下方式操作:
var linkedList = new LinkedList<int>(new[] { 1, 2, 3, 4 });
这个技巧是先使用集合初始化器初始化一个数组,然后将该数组传递给LinkedList的构造函数。
有人问这种方法为什么效率低下,是因为时间复杂度高吗?还是只是因为它内部使用了数组?对不起,这个问题迟了一年半。
这种方法效率稍低的原因在于,在调用LinkedList的构造函数之前必须先分配数组(new[] {...})。你需要进行基准测试来确定在你的情况下这种方法的效果有多大。
集合初始化是C# 3.0中的一种语法,可以在创建集合对象时直接初始化集合的元素。然而,要使用集合初始化,被初始化的集合对象必须实现了System.Collections.IEnumerable接口,否则会产生编译错误。
集合初始化是通过调用目标对象的Add方法来实现的。对于每个指定的元素,集合初始化器将元素初始化列表作为参数列表传递给目标对象的Add方法。因此,集合对象必须包含一个适用于每个元素初始化器的Add方法。
这个设计是有道理的,编译器在使用集合初始化时会确保你正在操作一个实现了可枚举类型并且包含一个Add函数的集合类型。这样通过Add方法来进行初始化。
如果不满足上述条件,编译器将会报错。
(Collection initialization)问题的出现的原因是由于在第二个示例中,尝试将int[]分配给List
正如上述提到的,LinkedList没有将Add()方法作为其接口的一部分来定义(ICollection.Add有一个显式实现),所以这种语法糖无法使用。
然而,对于LinkedList来说,有一个简单的解决方法。可以创建一个LinkedListWithInit
代码如下所示:
public class LinkedListWithInit: LinkedList { public void Add(T item) { ((ICollection )this).Add(item); } } LinkedList list = new LinkedListWithInit { 1, 2, 3, 4, 5 };
这种方式在LinkedList上实现了初始化操作。
然而,有人认为这种情况有点奇怪,因为LinkedList(T)实际上确实有一个Add方法,该方法是针对ICollection(T)接口实现的。尽管该方法是显式实现的,因此在不将列表转换为ICollection(T)的情况下不可访问,但我认为它应该是有效的。
但是,在创建并尝试初始化列表之间无法将其转换为ICollection,因此显式实现的接口是无用的。我已更新我的答案以阐明这一点。
我的意思是,我认为编译器应该足够智能,能够找到接口的Add方法。LinkedList(T)的Add方法本应该不需要显式实现,但这是另一个问题了。
在查找方法时,编译器可能没有检查类型实现的所有接口。在能否合理地这样做之前,我需要考虑所有的用例。我也不确定为什么它没有直接实现;这种方式似乎是合理的。
这种被忽视的问题困扰我,因为为了向后兼容性,它们不会修复它,对吧?而类库不应该一直更新以得到更好的改进吗?
以上是(Collection initialization)问题的原因和解决方法。