c#阿尔法电话号码翻译

我有一个家庭作业,程序将接受任何类似于555-GET-FOOD格式的电话号码。 任务是将字母字母映射到数字并将数字转换为数字等效字母。
例如:A,B,C = 2; D,E,F = 3; 等等…

我们此时尚未涉及类或创建地图,因此这些不是可行的解决方案。 本章确实涵盖了枚举,所以我正在努力使用枚举类型来解决。 我有一个方法设置来validation数据(确保正确的#字符和连字符在正确的位置),这确实工作正常。 我有另一个方法设置来删除连字符,并使用ToUpper()方法,这也正常工作,所以foreach循环我已经使用这两个方法已经完成后的数字设置我们。

我还设置了一个方法,在转换发生后运行,以添加连字符,这也有效。

我已经尝试了几种方法来工作并让他们注意到他们可能成为我需要使用的机会,因为我尝试使用switch语句我现在只设置字母A,并计划如果我能够使其工作,请完成剩余的字母。 我认为我的问题是foreach循环使用char类型,并且交换机使用int。 在foreach循环中尝试代码时似乎是同样的问题,但我不知道如何修复所以任何建议都值得赞赏。

public enum AlphaNumber { 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, S=8, T=8, U=8, V=9, W=9, X=9, Y=9, Z=9 } private void UpdatePhone(AlphaNumber phone) { switch (phone) { case AlphaNumber.A: //return AlphaNumber.(int[])Enum.GetValues(typeof(AlphaNumber)); //return (Enum.GetValues(typeof(AlphaNumber))); // (int)ValueType; Enum.GetValues(typeof(AlphaNumber)); break; } private void translateButton_Click(object sender, EventArgs e) { numberLabel.Text = "";//Clear the numberLabel //Get a trimmed copy of the user's input. string input = numberTextBox.Text.Trim(); if (IsValidFormat(input)) { Unformat(ref input); foreach (char ch in input) { if (char.IsLetter(ch))// { ch = (char)Enums.AlphaNumber.Active; //ch = (char)Enum.GetValues(typeof(AlphaNumber)); //ch = Enum.TryParse(AlphaNumber); // ch = AlphaNumber.(int[])Enum.GetValues(typeof(AlphaNumber)); //UpdatePhone(ch); MessageBox.Show("Character is char"); } } TelephoneFormat(ref input); numberLabel.Text = input; 

我对任何建议持开放态度,并感谢您提供的任何帮助。 我需要帮助的地方在foreach循环中,我正在查看每个值,如果它是一个字母,我想从枚举值中获取值,并将char替换为数字值。

删除enumswitch ,而是对地图进行查找。 我已经创建了一个.NET Fiddle,它可以在这里按照需要进行演示。

但是如果使用Dictionary是出于某些奇怪的原因,那么我想你可以使用这个版本 – 我在其中使用enum 。 这只是一项工作量越来越多,而且运动部件越多,维护起来越困难。

C# ,类型enum默认inheritance自int ,但您可以指定各种其他数字类型 – 如bytelong等…其中一个关键要点是装箱/拆箱和从一种类型转换/转换的概念另一个。 如果你有一个enum定义为enum Foo { Bar = 63 }并且你试图 cast它转换为char你会期望得到什么?

这实际上会导致char ? – 看一下ASCII表 ,找到63的DEC ,看看它为Char列映射的内容。

这个疯狂的复杂问题解决了这个问题:

  public enum AlphaNumber { 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, S=8, T=8, U=8, V=9, W=9, X=9, Y=9, Z=9 } public static class PhoneNumber { public static char ParseInput(char input) { if (input == '-' || char.IsDigit(input)) { return input; } if (char.IsLetter(input)) { var num = (AlphaNumber)(Enum.Parse(typeof(AlphaNumber), (char.IsLower(input) ? char.ToUpperInvariant(input) : input).ToString())); return ((int)num).ToString()[0]; } return '\0'; } } 

虽然“map”(在C#/ .Net中实现为Dictionary )可能是此问题的最佳选择,但基本数学对于这种简单的转换就足够了:

  Console.WriteLine(String.Join("", // combine characters back to string "555-GET-FOOD" //value .ToUpperInvariant() // carefully converting to avoid Turkish I problems .Select(c=> (c>='A' && c<='Z') ? // only tweak AZ range Math.Min((c-'A')/3+2,9).ToString()[0] : c))) 

看起来你确实试图使用TryParse

//ch = Enum.TryParse(AlphaNumber);

这是您可能想要使用的方法。 但是在这种forms中存在许多问题,如你所提到的那样可能会给你带来错误。

此方法所需的参数是一个string (与枚举常量或enum名称匹配)和要解析的enum类型的out参数。 该方法返回一个bool

如果TryParse成功,则该方法返回TRUE,并带有out参数中enum设置的相应值。

此代码应该允许您使用变量ch作为要解析的输入的string ,将您想要的结果作为int获取:

 AlphaNumber parsedCh; int? chValue = null; if (Enum.TryParse(ch.ToString().ToUpper(), out parsedCh)) { chValue = (int)parsedCh; Console.WriteLine(chValue); } 
 using System; public class Program { public static void Main() { Console.WriteLine(AlphaPhoneToNumber("555-GET-FOOD")); } public static string AlphaPhoneToNumber(string val){ //strings are immutable so let's get the array version of the value var phoneNumberArr = val.ToCharArray(); for(int i = 0; i < val.Length; i++){ phoneNumberArr[i] = AlphaPhoneCharToNumber(phoneNumberArr[i]); } return new string(phoneNumberArr); } public static char AlphaPhoneCharToNumber(char val){ switch(val){ case 'A': case 'B': case 'C': return '2'; case 'D': case 'E': case 'F': return '3'; case 'G': case 'H': case 'I': return '4'; case 'J': case 'K': case 'L': return '5'; case 'M': case 'N': case 'O': return '6'; case 'P': case 'Q': case 'R': return '7'; case 'S': case 'T': case 'U': return '8'; case 'V': case 'W': case 'X': case 'Y': case 'Z': return '9'; default: return val; } } } 

以下是没有开关的方法:

 public static char AlphaPhoneCharToNumber2(char val){ // All three arrays are of exact same length var ualphas = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray(); var lalphas = "abcdefghijklmnopqrstuvwxyz".ToCharArray(); var numval = "22233344455566677788899999".ToCharArray(); // thus I will loop up to the max length of one of the arrays // remember they are all the same length for(int i = 0; i < ualphas.Length; i++){ //I will check if the value is in one of the alphabet //arrays at the current index //if there is a match I will assign it the number value //at the same index // MATCH UPPER? MATCH LOWER? RETURN NUMBER if(ualphas[i] == val || lalphas[i] == val) return numval[i]; } // ELSE RETURN THE ORIGINAL VALUE return val; } 

以下是一些简单逻辑处理电话号码的选项,如上所述。 请注意,虽然一种新颖的方法,使用Enum将字母映射到整数值有点使过程复杂化,而不是需要它。

即使有其他方法专门用于映射字母数字电话号码(想想Regex),如果您确实需要使用枚举名称和值进行迭代或处理,那么我希望您发现这些算法很有用。

字典作为要处理的映射构造要简单得多。

在表达式中定义LetterNumber映射的正则表达式将再次优越。

 ///  /// Iterates through the characters in a phone number converting letters to digits. ///  /// Uses StringBuilder to build the output iteratively, this method does not attempt to validate the number passed in ///  /// Phone number to parse /// Phone number output where letters have been parsed into their digit values private string ParsePhoneNumber_StringBuilder(string str) { StringBuilder output = new StringBuilder(); foreach (char ch in str.ToCharArray()) { // Convert each letter to it's numeric value as defined in the LetterNumber enum // Dashes are not letters so they will get passed through if (char.IsLetter(ch)) { if (Enum.IsDefined(typeof(LetterNumber), ch.ToString())) { LetterNumber letterNumber = (LetterNumber)Enum.Parse(typeof(LetterNumber), ch.ToString(), true); output.Append((int)letterNumber); } } else output.Append(ch); } return output.ToString(); } ///  /// Uses Linq to parse the characters in a phone number converting letters to digits. ///  /// This method does not attempt to validate the number passed in ///  /// Phone number to parse /// Phone number output where letters have been parsed into their digit values private string ParsePhoneNumber_Linq(string str) { return String.Join("", str.Select(c => char.IsLetter(c) ? ((int)((LetterNumber)Enum.Parse(typeof(LetterNumber), c.ToString(), true))).ToString() : c.ToString())); } ///  /// Iterates through the LetterNumber values and replaces values found in the passed in phone number. ///  /// Iterates through Enum Names and applied String.Replace ///  /// Phone number to parse /// Phone number output where letters have been parsed into their digit values private string ParsePhoneNumber_Replacement(string str) { str = str.ToUpper(); // we will compare all letters in upper case foreach (string letter in Enum.GetNames(typeof(LetterNumber))) str = str.Replace(letter.ToUpper(), ((int)((LetterNumber)Enum.Parse(typeof(LetterNumber), letter))).ToString()); return str; }