使用编译时的值</int>创建List <int>

时间:2009-04-27 10:33:05

标签: c# generics

可以在编译时创建一个数组,如;

int[] myValues = new int[] { 1, 2, 3 } ;

但我想做这样的事情;

List<int> myValues = new List<int>() { 1, 2, 3 };

编译器说没有。有没有办法在不使用LINQ(C#3.0)的情况下执行此操作(C#2.0)?

5 个答案:

答案 0 :(得分:48)

List<int> myValues = new List<int>(new int[] { 1, 2, 3 } );

这将创建一个中间数组,但是可能有更有效的方法来做同样的事情。

编辑:

John Feminella建议创建一个工厂方法来接受参数列表并返回一个List,您可以按如下方式实现:

List<T> CreateList<T>(params T[] values)
{
    return new List<T>(values);
}

您可以使用如下:

List<int> myValues = CreateList(1, 2, 3);

答案 1 :(得分:33)

帕特里克有你想要的答案。但我想补充一点。如果你想做更长的数字范围并且不想手动输入它们,你应该看看Enumerable.Range方法。它可用于在运行时生成一系列序列号。例如,您的样本可以写成如下

var list = Enumerable.Range(1,3).ToList();

答案 2 :(得分:4)

你建议的方式最初是在C#3.0中引入的(与LINQ无关,它是引入的语言功能)。

C#2.0中没有“快捷方式”(列表初始化)可以做到这一点,无论是新增列表,然后通过myValues.Add手动添加数字,或者您可以执行以下操作:

int[] arrMyValues = new int[] {1, 2, 3};
List<int> myValues = new List<int>(arrMyValues);

T的列表可以在它的构造函数中包含一个IE的数量,其中它将包含创建的列表中的IEnumerable中的所有T,看作int []实现T的IEnumerable,你可以“混合和匹配”这些特性像这样。

除此之外,在C#2.0中没有办法做你所描述的事情。

答案 3 :(得分:3)

集合初始值设定项只是语法糖,因此如果使用3.0编译器进行编译,则可以在针对2.0的应用程序中使用它们。

答案 4 :(得分:1)

您也可以使用System.Linq.Enumerable:

这样做
int[] categories = { 221, 222, 223, 224, 225, 226, 227, 228, 235, 236, 254, 255, 256 };        
var ticketsToProcess = categories.ToList();