C# 将文本转换为手机键盘的有效方法

C# 将文本转换为手机键盘的有效方法,c#,string,dictionary,C#,String,Dictionary,我有以下代码,用于将包含字母数字字符的字符串转换为可以使用手机键盘输入手机的数字字符串: string text = "sometext containing spaces and numbers 12345"; Dictionary<char, char> alphabetMapping = new Dictionary<char, char>(); alphabetMapping['a'] = '2'; alphabetMapping['b'] = '2'; alph

我有以下代码,用于将包含字母数字字符的字符串转换为可以使用手机键盘输入手机的数字字符串:

string text = "sometext containing spaces and numbers 12345";
Dictionary<char, char> alphabetMapping = new Dictionary<char, char>();
alphabetMapping['a'] = '2';
alphabetMapping['b'] = '2';
alphabetMapping['c'] = '2';
alphabetMapping['d'] = '3';
alphabetMapping['e'] = '3';
alphabetMapping['f'] = '3';
alphabetMapping['g'] = '4';
alphabetMapping['h'] = '4';
alphabetMapping['i'] = '4';
alphabetMapping['j'] = '5';
alphabetMapping['k'] = '5';
alphabetMapping['l'] = '5';
alphabetMapping['m'] = '6';
alphabetMapping['n'] = '6';
alphabetMapping['o'] = '6';
alphabetMapping['p'] = '7';
alphabetMapping['q'] = '7';
alphabetMapping['r'] = '7';
alphabetMapping['s'] = '7';
alphabetMapping['t'] = '8';
alphabetMapping['u'] = '8';
alphabetMapping['v'] = '8';
alphabetMapping['w'] = '9';
alphabetMapping['x'] = '9';
alphabetMapping['y'] = '9';
alphabetMapping['z'] = '9';
alphabetMapping['1'] = '1';
alphabetMapping['2'] = '2';
alphabetMapping['3'] = '3';
alphabetMapping['4'] = '4';
alphabetMapping['5'] = '5';
alphabetMapping['6'] = '6';
alphabetMapping['7'] = '7';
alphabetMapping['8'] = '8';
alphabetMapping['9'] = '9';
alphabetMapping['0'] = '0';
alphabetMapping['.'] = '0';
alphabetMapping[','] = '0';
alphabetMapping['@'] = '0';
alphabetMapping['*'] = '*';
alphabetMapping['#'] = '#';
alphabetMapping[' '] = '0'; // not sure if this underscore or space

StringBuilder sb = new StringBuilder();
foreach (var c in text)
{
    sb.Append(alphabetMapping[c]);
}

Console.WriteLine(sb.ToString());
string text=“sometext包含空格和数字12345”;
字典alphabetMapping=新字典();
字母映射['a']='2';
字母映射['b']='2';
字母映射['c']='2';
字母映射['d']='3';
字母映射['e']='3';
字母映射['f']='3';
字母映射['g']='4';
字母映射['h']='4';
字母映射['i']='4';
字母映射['j']='5';
字母映射['k']='5';
字母映射['l']='5';
字母映射['m']='6';
字母映射['n']='6';
字母映射['o']='6';
字母映射['p']='7';
字母映射['q']='7';
字母映射['r']='7';
alphabetMapping['s']='7';
字母映射['t']='8';
字母映射['u']='8';
字母映射['v']='8';
字母映射['w']='9';
字母映射['x']='9';
字母映射['y']='9';
字母映射['z']='9';
alphabetMapping['1']='1';
字母映射['2']='2';
字母映射['3']='3';
字母映射['4']='4';
字母映射['5']='5';
字母映射['6']='6';
字母映射['7']='7';
字母映射['8']='8';
字母映射['9']='9';
alphabetMapping['0']='0';
alphabetMapping['.]='0';
alphabetMapping[',']=“0';
alphabetMapping['@']='0';
alphabetMapping['*']='*';
字母映射['#']='#';
alphabetMapping['']=“0';//不确定这是下划线还是空格
StringBuilder sb=新的StringBuilder();
foreach(文本中的var c)
{
sb.追加(字母映射[c]);
}
Console.WriteLine(sb.ToString());
输出:
76638398026682464640772237026306862377012345

这并不是说它有很多实际用途,但是一些自动电话系统要求输入可能包含字母的密码,所以我写了这段代码来帮助实现这一点


有没有一种更有效的方法来解决这个问题,或者我的思路正确吗?

考虑到数据集的大小(字母数字字符和字母)和预期的应用程序,这似乎是最符合逻辑、看起来也是最理想的方法。如果您想提高性能,可以使用哈希集,但我不确定您是否能从这个数据集中看到任何可测量的收益。

如果您将所有项目组合在一起,则可以使用更少的代码行

var allValues = new List<KeyValuePair<string,char>>()

allValues.Add(new KeyValuePair("abc2","2"));
allValues.Add(new KeyValuePair("def3","3"));
etc, etc

StringBuilder sb = new StringBuilder();
foreach (var c in text)
{
    var matched = allValues.FirstOrDefault(kvp=> kvp.Key.Contains(c));
    if(matched != null)
    {
       sb.Append(matched.Value);
    }
    else
    {
       sb.Append(" ");
    }
}

Console.WriteLine(sb.ToString());
var allValues=new List()
添加(新的KeyValuePair(“abc2”,“2”));
添加(新的KeyValuePair(“def3”,“3”));
等等等等
StringBuilder sb=新的StringBuilder();
foreach(文本中的var c)
{
var matched=allValues.FirstOrDefault(kvp=>kvp.Key.Contains(c));
如果(匹配!=null)
{
某人附加(匹配的值);
}
其他的
{
某人加上(“”);
}
}
Console.WriteLine(sb.ToString());

它的计算效率可能不会更高,但人类阅读起来就更少了。

将电话字母转换为各自的数字的一种优雅方式是使用正则表达式。这是我使用的函数。它可能需要调整以适合您的场景

internal static string ConvertPhoneTexttoNumber(string PhoneNumber)
{
    PhoneNumber = Regex.Replace(PhoneNumber, @"[abcABC]", "2");
    PhoneNumber = Regex.Replace(PhoneNumber, @"[defDEF]", "3");
    PhoneNumber = Regex.Replace(PhoneNumber, @"[ghiGHI]", "4");
    PhoneNumber = Regex.Replace(PhoneNumber, @"[jklJKL]", "5");
    PhoneNumber = Regex.Replace(PhoneNumber, @"[mnoMNO]", "6");
    PhoneNumber = Regex.Replace(PhoneNumber, @"[pgrsPGRS]", "7");
    PhoneNumber = Regex.Replace(PhoneNumber, @"[tuvTUV]", "8");
    PhoneNumber = Regex.Replace(PhoneNumber, @"[wxyzWXYZ]", "9");

    //remove all non alphanumeric characters
    PhoneNumber = Regex.Replace(PhoneNumber, @"[\W]", "");             

    return PhoneNumber;
 }
此解决方案适用于字符串中任意数量的字符。如果要保留括号和破折号,请删除此行:

PhoneNumber = Regex.Replace(PhoneNumber, @"[\W]", "");
注意:如果您不知道如何使用正则表达式,这里有一个很棒的教程:

我有一架纸飞机。但我们都没有问题,这里的问题是什么?你是在问这是否是最有效的方法吗?我无意中在没有问完问题的情况下发布了帖子。对不起,我觉得这很合适