2011-04-17 21 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])); 
相關問題