【发布时间】:2013-12-01 10:08:51
【问题描述】:
我正在尝试查找是否有一种快速方法可以获取字母表中字符的整数位置 (C#)。
我可以简单地创建一个数组并获得位置,但似乎必须有一种“漂亮而时髦”的方式来实现这一点?
我还研究了将(大写)字符的 ASCII 位置与“65”相关的位置...但同样,这似乎比应有的工作要多!
[仅限英文 26 个字母,不需要国际化 - 不,这不是家庭作业!]
【问题讨论】:
标签: c# alphabetical
我正在尝试查找是否有一种快速方法可以获取字母表中字符的整数位置 (C#)。
我可以简单地创建一个数组并获得位置,但似乎必须有一种“漂亮而时髦”的方式来实现这一点?
我还研究了将(大写)字符的 ASCII 位置与“65”相关的位置...但同样,这似乎比应有的工作要多!
[仅限英文 26 个字母,不需要国际化 - 不,这不是家庭作业!]
【问题讨论】:
标签: c# alphabetical
编程 101:
char c = 'A';
//char c = 'b'; you may use lower case character.
int index = char.ToUpper(c) - 64;//index == 1
【讨论】:
int index = ((int) char.ToUpper(c)) - 64;
int index = char.ToUpper(c) - 'A'; 另外,A 不应该位于索引 0 处吗? C# 使用从 0 开始的索引!
int index = (int)c % 32;.
小写和大写:
int index = (int)c % 32;
【讨论】:
return (char) ( 'a' + (position - 1) 怎么样?
由于 char 和 int 可以在计算中混合和匹配,您可以将 char 视为一个数字(这肯定介于众所周知的值之间):
char c = 'A';
var index = (c < 97 ? c - 64 : c - 96);
【讨论】:
@Ahmed 方法的清晰、可读、基于 0 的实现,带有边界检查。
/// <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';
}
【讨论】:
这是一个很好的实现,用于从 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;
}
【讨论】:
受弗拉基米尔回答的启发,另一种方法是
int index= c & 0b11111;
解释:'A' 在 ascii 中是 65,在二进制中是 01000001。
'a' 是 95,即二进制 01100001。如果我们简单地丢弃 3 个最高有效字节,我们将获得字母整数位置,这就是位掩码的作用。
【讨论】: