枚举字母表的最快方法

Ben*_*Ben 70 c# alphabet

我想迭代字母表,如下所示:

foreach(char c in alphabet)
{
 //do something with letter
}
Run Code Online (Sandbox Code Playgroud)

一组字符是最好的方法吗?(感觉很讨厌)

编辑:度量标准是"实现最少的类型,同时仍然可读且健壮"

Ric*_*lay 148

(假设ASCII等)

for (char c = 'A'; c <= 'Z'; c++)
{
    //do something with letter 
} 
Run Code Online (Sandbox Code Playgroud)

或者,您可以将其拆分为提供程序并使用迭代器(如果您计划支持国际化):

public class EnglishAlphabetProvider : IAlphabetProvider
{
    public IEnumerable<char> GetAlphabet()
    {
        for (char c = 'A'; c <= 'Z'; c++)
        {
            yield return c;
        } 
    }
}

IAlphabetProvider provider = new EnglishAlphabetProvider();

foreach (char c in provider.GetAlphabet())
{
    //do something with letter 
} 
Run Code Online (Sandbox Code Playgroud)

  • 如果你是foreache foreach:`Enumerable.Range('a','z' - 'a'+ 1).选择(x =>(char)x)` (13认同)
  • 它只是示例代码,我无法在我的答案中编写整个应用程序.通过使用静态方法,您的解决方案将耦合到AlphabetProvider类. (8认同)
  • 哇......从未想过这一点.辉煌! (3认同)
  • @Rob - 唉!我忘了普通参数之间的普通模型不能正常工作.如果您编写自己的`Cast`版本,您会发现编译器不会接受它,除非您首先转换为`object`.这使得它成为一个拳击转换,所以你只能得到你输入的任何东西.所以我撤回我的评论. (2认同)
  • 如果你可以添加接口的定义`public interface IAlphabetProvider {IList <string> GetAlphabet();那将是非常好的.因为它是用户定义的界面,所以为了清晰起见.首先看起来好像`IAlphabetProvider`是.Net框架类库中已经存在的接口,你只需实现它来解决OP的问题. (2认同)

Col*_*ell 37

或者你可以做到,

string alphabet = "abcdefghijklmnopqrstuvwxyz";

foreach(char c in alphabet)
{
 //do something with letter
}
Run Code Online (Sandbox Code Playgroud)

  • 有了这个解决方案,国际化很容易:使用不同的字母:)(假设C#的foreach char逐字而不是8位序列).如果没有,我不知道C#中多字节字符的最佳方法. (2认同)

小智 8

var alphabet = Enumerable.Range(0, 26).Select(i => Convert.ToChar('A' + i));
Run Code Online (Sandbox Code Playgroud)


Joh*_*ker 5

Enumerable.Range(65, 26).Select(a => new { A = (char)(a) }).ToList().ForEach(c => Console.WriteLine(c.A));
Run Code Online (Sandbox Code Playgroud)

  • 更新一个匿名对象以存储单个属性没有多大意义。内置的`foreach`语句通常对于在序列的每个项目上执行操作都更加清晰-这就是它的用途。 (2认同)