C#: 生成年份整数列表

19

我想创建一个包含从1930到2010这些整数的C# List。从我的直觉来看,唯一能想到的方法是使用forwhile循环,遍历两个数字之间的每个整数,并将它们逐个添加到List中。

我知道在使用Linq时,C# List有许多有趣的方法。有没有人能想出一种更高效的方法呢?


你能再解释一下,为什么你要创建这些年份吗?这样我们才能给出更好的建议。 - Ahmet Kakıcı
使用while/for循环会更有效率。从效率的角度来看,重复使用结果比如何创建结果更为重要。 - Tim Lloyd
@chibacity,我正在构建在HTML中用于下拉选择列表的值,因此可能没有太多需要担心列表将如何使用。 - Matt
啊,我明白了 - 你的意思是“更少的代码”,而不是“更好的性能”。 - Tim Lloyd
4个回答

43

Enumerable.Range(1930, 81) (MSDN文档) 可以获得包含所需数字的可枚举对象。第一个参数是起始值,第二个参数是项目数。你需要81而不是80,因为你想要包括从1930到2010的年份。

如果你明确想要它作为一个 List,则使用 Enumerable.Range(1930, 81).ToList()

这种方法在效率上可能没有什么区别,但是代码更加简洁。


1
+1。它更好地记录了意图,比命令式更声明式,并且不太容易出错,例如意外修改循环变量。另外:我希望有一个类似于范围的函数,它接受下限和上限,而不是下限和计数。虽然不确定该如何称呼它,或者如何处理包含/排除的命名/使用问题 :) - Merlyn Morgan-Graham
@Merlyn:是的,我同意。类似于F#的[1930..2010]语法会很不错。 - adrianbanks

11

使用 Enumerable.Range()

var MyList = Enumerable.Range(1930, 2010-1930+1).ToList();

1
我能不能只使用 new List<int>(Enumerable.Range(1930, 2010-1930+1)) 来避免循环呢? - Matt
@Mega:什么循环?他代码中的任何循环也将存在于您的代码中(将可枚举对象复制到列表中)。 - Merlyn Morgan-Graham
@Merlyn:我改变了我的答案。原本它里面有一个循环。 - Jim Mischel

10

其他两个回答是正确的,使用Enumberable.Range()是快速/简便的方法,但我想要补充一下。使用DateTime.Now.Year,这样你就不必每年都修改代码。在两个月内,对第二个参数使用硬编码值将使其过时。

List<int> listYears = Enumerable.Range(1930, DateTime.Now.Year - 1930 + 1).ToList();

2
因此,虽然这个问题已经得到了回答(并且是好的回答),但为什么不创建一个“生成器方法”,它可以“产生”(一个生成器方法)——Enumerable.Range就是一个标准的这样的方法:
IEnumerable<int> InclusiveRange(int s, int e) {
   for (int i = s; i <= e; i++) {
     yield return i;
   }
}

var r = InclusiveRange(1930, 2010).ToList();

愉快的编码。


我会将它与 jb. 的答案结合起来:var r = InclusiveRange(1930, DateTime.Now.Year - 1930 + 1).ToList(); :) - Noctis
@Noctis 不需要减去起始年份;只需使用 var r = InclusiveRange(1930, DateTime.Now.Year).ToList(); - Stajs

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