把字符转换为其字母表中的整数位置?

60

我正在寻找一种快速获取字母在字母表中整数位置的方法(C#)。

我可以简单地创建一个数组并获取该位置,但似乎必须有一种“好玩又时髦”的方式来实现这一点?

我还尝试了根据大写字符与“65”之间的ASCII位置来获取位置,但似乎比应该更加繁琐!

[仅适用于英文26个字母表,不需要国际化 - 不,这不是作业!]

6个回答

114

编程入门:

char c = 'A';
//char c = 'b'; you may use lower case character.
int index = char.ToUpper(c) - 64;//index == 1

4
int index = ((int) char.ToUpper(c)) - 64; - Ahmed KRAIEM
2
so include it in answer :) - Kamil Budziewski
6
不需要进行转换。只需执行 int index = char.ToUpper(c) - 'A'; 此外,A 不应该在索引 0 处吗?C# 使用基于 0 的索引! - Matthew Watson
@MatthewWatson - 如果A是一个数组,我同意它等于0,但在这种特殊情况下,我希望A代表“字母表中的第一个字符”。 - BlueChippy
另一种变体:int index = (int)c%32; - Vladimir
显示剩余3条评论

72

对于大小写:

int index = (int)c % 32;

6
我不得不尝试一下,因为我不相信它会起作用……但它确实起作用了,这太棒了! - Alex
1
'a' 是 0x41,'A' 是 0x61。0x20 = 32。而且 26 < 32。 - Vladimir
1
很聪明,@Vladimir。 - code4life
3
@Vladimir,倒过来呢?从索引获取字符? - Luiey
@Luiey,直接使用return (char)('a' + (position - 1))怎么样? - mamuesstack

8
一种清晰易读的、基于0的实现,包含Ahmed方法的边界检查。
/// <summary>
/// Converts a latin character to the corresponding letter's index in the standard Latin alphabet
/// </summary>
/// <param name="value">An upper- or lower-case Latin character</param>
/// <returns>The 0-based index of the letter in the Latin alphabet</returns>
private static int GetIndexInAlphabet(char value)
{
    // Uses the uppercase character unicode code point. 'A' = U+0042 = 65, 'Z' = U+005A = 90
    char upper = char.ToUpper(value);
    if (upper < 'A' || upper > 'Z')
    {
        throw new ArgumentOutOfRangeException("value", "This method only accepts standard Latin characters.");
    }

    return (int)upper - (int)'A';
}

将返回值转换为基于1的值非常简单,留给读者自行处理。 ;) - Michael Richardson

7

由于charint在计算中可以混用,因此您可以将char作为数字处理(这将确保其值在众所周知的范围内):

char c = 'A';
var index = (c < 97 ? c - 64 : c - 96);

3

这是一个很好的实现方式,可以将Excel字符串中的列读入到列号中。感谢上面解答的@ahmed-kraiem和@vladimir。

   public int AddColFromLetter(string s)
    {
        int column = 0;
        int iter = 1;
        foreach (char c in s)
        {
            int index = char.ToUpper(c) - 64;//Ahmed KRAIEM
            //int index = (int)c % 32;//Valdimir
            if(iter == 1)
                column += index;
            if(iter > 1)
                column += 25+ index;
            iter++;
        }
        return column;
    }

1
正是我想要的!运行得非常好。 - Morvael

1
受弗拉基米尔回答的启发,另一种实现方法是:
int index= c & 0b11111;

解释:在ascii码中,'A'为65,二进制为01000001。'a'为95,二进制为01100001。如果我们简单舍弃三个最高位字节,就可以得到字母的整数位置,这就是掩码所做的事情。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接