来自Enumerable.Range的A到Z的char列表

TCM*_*TCM 11 .net c# linq

我想从Enumerable.Range中创建一个列表.这段代码是否正确?

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

或者有更好的方法来制作这种类型的列表吗?

Can*_*cer 39

也许是这样的?

var surnameList = Enumerable.Range('A', 'Z' - 'A' + 1).
                     Select(c => (char)c).ToList();
Run Code Online (Sandbox Code Playgroud)


ang*_*son 18

嗯,string是的IEnumerable<char>,所以这也有效:

"ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToList()
Run Code Online (Sandbox Code Playgroud)

你必须权衡利弊.

优点:

  • 比你的循环更容易阅读上面的代码(主观,这是我的意见)
  • 更短的代码(但可能不足以说明问题)

缺点:

  • 如果您不知道如何.ToList()处理字符串,则难以阅读
  • 例如,可以引入错误,你会在这里轻易发现错误:

    "ABCDEFGHIJKLMN0PQRSTUVWXYZ".ToList()
    
    Run Code Online (Sandbox Code Playgroud)

    很容易,我的意思是你会发现错误,因为你只是阅读过代码,而不是你知道这里有问题并去寻找它.

  • HAHAH!我弄错了复制你发布的第二个版本(编号为"0").在我开始拔头发之前,我很高兴能抓住它! (2认同)

tod*_*dmo 5

我接受了Can的回答并做了一个扩展功能:

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

用法:

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

  • 如果这就是您想要编写的内容,那么这不是扩展方法。这只是一个静态方法。 (2认同)