2011-04-17 40 views
8

我想从Enumerable.Range创建一个列表。这段代码是否正确?从Enumerable.Range的字符到Z的列表

SurnameStartLetterList = new List<char>(); 
Enumerable.Range(65, 26).ToList().ForEach(character => SurnameStartLetterList.Add((char)character)); 

或者还有更好的方法来使这种类型的列表?

感谢提前:)

+4

'新名单 { 'A', 'B',... 'Z'}'我现在闭嘴。 – BoltClock 2011-04-17 13:46:38

+0

@BoltClock:你最好;) – TCM 2011-04-17 13:50:58

+0

但我应该这样说:不应该你的'Range()'是'Range(65,26)'?第二个参数不是结束数字,它是范围的长度。 – BoltClock 2011-04-17 13:51:07

回答

15

好,stringIEnumerable<char>,所以这也将工作:

"ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToList() 

你必须权衡这个利弊。

优点:

  • 更易于阅读比你的循环上面的代码(主观的,这是我的意见)
  • 短的代码(但可能不足以占多)

缺点:

  • 如果您不知道什么.ToList()将使用字符串
  • 能引入错误,例如,你会很容易地发现这里的错误:

    "ABCDEFGHIJKLMN0PQRSTUVWXYZ".ToList() 
    

    通过轻松地我的意思是,你会发现错误,你只是读过去的代码,而不是你是否知道这里有一个问题,并且正在寻找它。

+2

哈哈!我错误地复制了您发布的第二个版本(数字为“0”)。我很高兴在我开始拔头发之前立即抓住它! – trnelson 2015-09-23 16:03:57

+1

如果你的目的可以使用'IList '而不是'List ',你可以直接使用''ABCDEFGHIJKLMNOPQRSTUVWXYZ“'。 – 2017-04-22 19:42:20

34

也许这样吗?

var surnameList = Enumerable.Range('A', 'Z' - 'A' + 1). 
        Select(c => (char)c).ToList(); 
+0

我**真的**喜欢这个解决方案,我最初的反应是*没办法,不能这样做*,但是果然。 – 2011-04-17 15:27:35

+0

更有趣的是做一个unicode版本! – 2011-04-17 15:40:41

+0

你是什么意思? – 2011-04-17 16:25:31

1

我把罐头的答案,并提出了扩展功能:

public static IEnumerable<char> Range(char start, char end) 
{ 
    return Enumerable.Range((int)start, (int)end - (int)start + 1).Select(i => (char)i); 
} 

用法:

Console.WriteLine(Range('a', 'f').Contains("Vive La France!"[6]));