c#阿尔法电话号码翻译

时间:2016-03-11 02:55:56

标签: c# foreach enums switch-statement

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

我们此时尚未涵盖类或创建地图,因此这些不是可行的解决方案。本章确实涵盖了枚举,所以我正在努力使用枚举类型来解决。我有一个方法设置来验证数据(确保正确的#字符和连字符在正确的位置),这确实可以正常工作。我有另一个方法设置来删除连字符,并使用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替换为数字值。

5 个答案:

答案 0 :(得分:0)

while" 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 A-Z range
             Math.Min((c-'A')/3+2,9).ToString()[0] : c)))

答案 1 :(得分:0)

删除enumswitch,然后对地图进行查找。我已经创建了一个.NET小提琴,它可以根据需要演示here

但如果使用Dictionary<char, char>是出于某种奇怪的原因,那么我想你可以使用this version - 我使用enum。这只是一项工作量越来越多,而且运动部件越多,维护起来越困难。

C#中,enum类型默认继承自int,但您可以指定其他各种数字类型,例如bytelong等...其中一个关键点是拳击/拆箱和从一种类型转换/转换为另一种类型的概念。如果您将enum定义为enum Foo { Bar = 63 }并将you try定义为cast,那么char您希望得到什么?

这实际上会产生字符? - 看看ASCII table并找到63的DEC并查看它映射到{{1}的内容列。

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

Char

答案 2 :(得分:0)

您似乎尝试使用TryParse

//ch = Enum.TryParse(AlphaNumber);

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

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

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

此代码应该允许您使用变量int作为ch来获取string所需的结果,以便解析输入:

AlphaNumber parsedCh;
int? chValue = null;

if (Enum.TryParse(ch.ToString().ToUpper(), out parsedCh)) 
{
    chValue = (int)parsedCh;
    Console.WriteLine(chValue); 
}

答案 3 :(得分:0)

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;
}

答案 4 :(得分:0)

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

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

  

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

     

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

/// <summary>
/// Iterates through the characters in a phone number converting letters to digits.
/// </summary>
/// <remarks>Uses StringBuilder to build the output iteratively, this method does not attempt to validate the number passed in</remarks>
/// <see cref="LetterNumber"/>
/// <param name="str">Phone number to parse</param>
/// <returns>Phone number output where letters have been parsed into their digit values</returns>
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();
}

/// <summary>
/// Uses Linq to parse the characters in a phone number converting letters to digits.
/// </summary>
/// <remarks>This method does not attempt to validate the number passed in</remarks>
/// <see cref="LetterNumber"/>
/// <param name="str">Phone number to parse</param>
/// <returns>Phone number output where letters have been parsed into their digit values</returns>
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()));
}

/// <summary>
/// Iterates through the LetterNumber values and replaces values found in the passed in phone number.
/// </summary>
/// <remarks>Iterates through Enum Names and applied String.Replace</remarks>
/// <see cref="LetterNumber"/>
/// <param name="str">Phone number to parse</param>
/// <returns>Phone number output where letters have been parsed into their digit values</returns>
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;
}