枚举字母的最快方法


74

我想像这样遍历字母:

foreach(char c in alphabet)
{
 //do something with letter
}

字符数组是执行此操作的最佳方法吗?(感觉很hacky)

编辑:度量标准是“在保持可读性和鲁棒性的同时实现最少键入”


每当您问一个“最佳”问题时,您都需要给出度量标准以进行评估,否则每个人都会提出一些特定的答案,而这些答案可能不适用于您的独特情况。
尼克·拉尔森

正如您所说的那样,唯一可能令人讨厌的是,您使用的是foreach循环而不是标准的for循环,但是即使如此,它也不是真正的错误。
Woot4Moo 2010年

我一直在寻找一种“更整洁”的方式,而不是列举一系列字符。度量标准是“在保持可读性和鲁棒性的同时,实现最少的键入”-理查德的答案与我最初的想法最接近(我在提问时无法明确表述)
本·阿斯顿

Answers:


162

(假设ASCII等)

for (char c = 'A'; c <= 'Z'; c++)
{
    //do something with letter 
} 

另外,您可以将其拆分给提供程序并使用迭代器(如果您打算支持国际化):

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 
} 

5
哇...从来没有想过。辉煌!
鲍比2010年

14
如果您针锋相对的话:Enumerable.Range('a', 'z'-'a' + 1).Select(x=>(char)x)
Rob Fonseca-

8
这只是示例代码,我无法在答案中编写整个应用程序。仅供参考,通过使用静态方法,您的解决方案将耦合到AlphabetProvider类。
理查德·萨雷

2
@Rob-啊!我忘记了常规转换在通用参数之间不起作用。如果您编写自己的版本Cast,则会发现编译器将不接受它,除非您强制转换为objectfirst。这使其成为拳击比赛的转换,因此您只能准确输入所输入的内容。因此,我撤回我的评论。
Daniel Earwicker 2010年

3
如果您可以将界面的定义也添加public interface IAlphabetProvider { IList<string> GetAlphabet(); }到帖子中以使其更加清晰,那将是非常不错的,因为它是用户定义的界面。从表面上看,它似乎IAlphabetProvider是.Net框架类库中已经存在的接口,并且您只需实现它即可解决OP的问题。
RBT

38

或者你可以做

string alphabet = "abcdefghijklmnopqrstuvwxyz";

foreach(char c in alphabet)
{
 //do something with letter
}

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

@JoeyAdams为实现国际化,您会从代码中删除硬编码的文字,并通过ResourceManager或其他方式获取它吗?
杰夫·B

1
@JoeyAdamsString.GetEnumerator()char成炭,所以你只需要一个部分Unicode代码点/代理对,如果你的字符串中包含此类字符。因此,您可能希望同时标准化您的字母和要与之比较的数据,并确保使用数字代码点而不是charstackoverflow.com/a/28155130/429091
binki

9
var alphabet = Enumerable.Range(0, 26).Select(i => Convert.ToChar('A' + i));

5
Enumerable.Range(65, 26).Select(a => new { A = (char)(a) }).ToList().ForEach(c => Console.WriteLine(c.A));

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

为了简化:Enumerable.Range(65,26).ToList()。ForEach(c => Console.WriteLine((char)c));
伊拉普(Eraph)2014年

2

您可以这样做:

for(int i = 65; i <= 95; i++)
{
    //use System.Convert.ToChar() f.e. here
    doSomethingWithTheChar(Convert.ToChar(i));
}

虽然,也不是最好的方法。如果我们知道原因,也许我们可以更好地提供帮助。



0

我找到了这个:

foreach(char letter in Enumerable.Range(65, 26).ToList().ConvertAll(delegate(int value) { return (char)value; }))
{
//breakpoint here to confirm
}

同时随机阅读此博客,并认为这是完成任务的有趣方式。


6
我希望这是个玩笑。真的:)
mw_21 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.