当前位置:  开发笔记 > 编程语言 > 正文

集合初始化

如何解决《集合初始化》经验,为你挑选了2个好方法。

你可以像这样初始化一个数组:

int [ ] arr = { 1, 2, 3, 4, 5 }; 

List不允许这样:

List list = { 1, 2, 3, 4, 5 }; 

这背后的原因是什么?

毕竟两者都允许这样:

int [ ] arr = new int [ ] { 1, 2, 3, 4, 5 }; 

List list = new List { 1, 2, 3, 4, 5 }; 

也是为什么不能用LinkedList?做到这一点?:

LinkedList ll = new LinkedList() { 1, 2, 3 };

更新

多谢你们.刚看到回复.我想选择几个答案,但它并没有让我这么做.

为什么LinkedList通过显式实现有一个Add方法?这可能会被修复吗?因为这样的问题在被忽视时会变成更大的问题,对吧?



1> tvanfosson..:

您的第一个示例是用于初始化整数数组的标准语言语法.左侧值的计算结果为int [].在第二个示例中,您尝试将int []分配给List .赋值运算符不支持它,因为它们是不同的类型.List 不是 int类型的数组.正如你所说的,有一个List 的构造函数,它确实将int []作为参数,并且在C#3.0中添加的新语法糖允许您使用{}将成员添加到由默认构造函数.

正如@Patrik所说,这对LinkedList不起作用,因为它没有将Add()方法定义为其接口的一部分(有一个ICollection.Add的显式实现),因此语法糖将不起作用.

但是,LinkedList有一个简单的解决方法.

public class LinkedListWithInit : LinkedList
{
    public void Add( T item )
    {
        ((ICollection)this).Add(item);
    }
}

LinkedList list = new LinkedListWithInit { 1, 2, 3, 4, 5 };



2> Jason Jackso..:

以下是C#3.0语言规范对此主题的评论:

以下是包含集合初始值设定项的对象创建表达式的示例:

List digits = new List { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

应用集合初始值设定项的集合对象必须是实现System.Collections.IEnumerable的类型,否则会发生编译时错误.对于按顺序的每个指定元素,集合初始值设定项在目标对象上调用Add方法,并将元素初始值设定项的表达式列表作为参数列表,为每次调用应用正常的重载决策.因此,集合对象必须包含每个元素初始值设定项的适用Add方法.

当你想到它时,这是有道理的.编译器确保您正在处理实现Add函数的可枚举类型(通过它执行初始化).

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有