在编译时创建带有值的List<int>

36

可以在编译时创建数组,例如:

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

但我想做类似这样的事情:

List<int> myValues = new List<int>() { 1, 2, 3 };
编译器说 No。有没有不使用 LINQ(C#3.0)的方法来完成这个问题(C#2.0)?

11
只是挑剔一下,后者并没有使用LINQ - 它使用的是来自C# 3.0的集合初始化器,但并不是严格意义上的LINQ。 - Jon Skeet
5个回答

63
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
另一个解决方案是创建您自己的工厂/扩展方法,该方法接受任何您喜欢的参数,并构造适当的List<int>。 - John Feminella

38

Patrick已经给出了你要找的答案。但是我想再补充一点。如果你想处理更长的数字范围并且不想手动输入,可以考虑使用Enumerable.Range方法。它可以在运行时生成一系列连续的数字。例如,你的示例可以按如下方式编写:

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

5
你提出的方法最早是在C# 3.0中引入的(与LINQ无关,它是引入的一种语言功能)。
在C# 2.0中没有“快捷方式”(列表初始化)可以做到这一点,要么新建列表然后通过myValues.Add手动添加数字,要么可以采用以下方法:
int[] arrMyValues = new int[] {1, 2, 3};
List<int> myValues = new List<int>(arrMyValues);

List of T可以在其构造函数中接受一个IEnumerable of T,其中它将包括在创建的列表中的该IEnumerable中的所有T,因为int[]实现了IEnumerable of T,您可以像这样“混合和匹配”功能。

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


3
集合初始化器只是语法糖,因此如果您使用3.0编译器编译,则可以在针对2.0的应用程序中使用它们。

0

你也可以这样做,使用 System.Linq.Enumerable:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接