sunflower
sunflower

Reputation: 531

The Replace method not working ,C#

I'm working on a phone number converter code with C# ,struggling with replacing any alphabetic character to its corresponding number on the phone keys.In the code down here ,the variable result already has a 10 characters ,wich is a mix of numbers and letters.As you see in the code ,I'm trying to use the Replace method through out the switch case,but it gives me wrong results .Any ideas ?Thanks. Sorry I forgot to mention that Arrays are not allowed to be used in this project,only conditions and repeatition.Ah ,and it's console C#.

for (int i = 0; i < result.Length; i++)
        {

            switch (buffer)
            {

                case "A":
                case "B":
                case "C": myNumber = result.Replace(buffer, "2");
                    break;
                case "D":
                case "E":
                case "F": myNumber = result.Replace(buffer, "3");
                    break;

                case "G":
                case "H":
                case "I": myNumber = result.Replace(buffer, "4");
                    break;



                case "J":
                case "K":
                case "L": myNumber = result.Replace(buffer, "5");
                    break;


                case "M":
                case "N":
                case "O": myNumber = result.Replace(buffer, "6");
                    break;

                case "P":
                case "Q":
                case "R":
                case "S": myNumber = result.Replace(buffer, "7");
                    break;

                case "T":
                case "U":
                case "V": myNumber = result.Replace(buffer, "8");
                    break;


                case "W":
                case "X":
                case "Y":
                case "Z": myNumber = result.Replace(buffer, "9");
                    break;

            }


            Console.WriteLine("({0})-{1}-{2}", myNumber.Substring(0, 3), myNumber.Substring(3, 3), myNumber.Substring(6, 4));

Upvotes: 0

Views: 414

Answers (4)

Luc
Luc

Reputation: 1528

Do remember to use StringBuilder when building strings, especialy when building strings in iterations.

private static readonly Dictionary<Char, Byte> mappings = new Dictionary<Char, Byte>() {
    { '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', 7 },
    { 'T', 8 }, { 'U', 8 }, { 'V', 8 },
    { 'W', 9 }, { 'X', 9 }, { 'Y', 9 }, { 'Z', 9},
    { ' ', 0 }
};

private static string StringToKeystrokes(string s)
{
    StringBuilder sb = new StringBuilder();
    foreach (char c in s)
    {
        if (mappings.ContainsKey(c))
        {
            sb.Append(mappings[c]);
        }
    }
    return sb.ToString();
}

Using the code.

string s = "ABC DEF GHI JKL MNO PQRS TUV WXYZ";
Console.WriteLine(s);
Console.WriteLine(StringToKeystrokes(s));

Upvotes: 0

gpmurthy
gpmurthy

Reputation: 2427

Consider the following rewrite...

    string result = "1800CALLME";
    string myNumber = string.Empty;
    for (int i = 0; i < result.Length; i++) 
    {
    string buffer = result[i].ToString(); 
    switch (buffer)
    {

        case "A":
        case "B":
        case "C": myNumber += "2";
            break;
        case "D":
        case "E":
        case "F": myNumber += "3";
            break;

        case "G":
        case "H":
        case "I": myNumber += "4";
            break;

        case "J":
        case "K":
        case "L": myNumber += "5";
            break;

        case "M":
        case "N":
        case "O": myNumber += "6";
            break;

        case "P":
        case "Q":
        case "R":
        case "S": myNumber += "7";
            break;

        case "T":
        case "U":
        case "V": myNumber += "8";
            break;


        case "W":
        case "X":
        case "Y":
        case "Z": myNumber += "9";
            break;

    }


    Console.WriteLine("({0})-{1}-{2}", myNumber.Substring(0, 3), myNumber.Substring(3, 3), myNumber.Substring(6, 4));

Good Luck!

Upvotes: 0

MarcinJuraszek
MarcinJuraszek

Reputation: 125660

You're assigning Replace method result to myNumber, but in next loop iteration you're taking result as Replace parameter again. It can't work.

How about that:

private static readonly Dictionary<string, string> PhoneReplacements =
    new Dictionary<string, string>() {
        { "A", "1" }, { "B", "1" }, { "C", "1" },
        { "D", "2" }, { "E", "2" }, { "F", "2" },
        { "G", "3" }, { "H", "3" }, { "I", "3" }
        // (...)
    };

private static string GetPhoneNumber(string number)
{
    foreach(var r in PhoneReplacements)
    {
        number = number.Replace(r.Key, r.Value);
    }
    return number;
}

Upvotes: 2

SJuan76
SJuan76

Reputation: 24895

String are immutable. When you do

result.Replace(buffer, "9");

result does not change.

So, you are only using the replacement of the last iteration, not the combination of all the replacements that your code has done. That is what you are assigning to your code.

Instead of

myNumber = result.Replace(buffer, "9");

do

result = result.Replace(buffer, "9");

or even, if you wish

myNumber = result = result.Replace(buffer, "9");

Upvotes: 1

Related Questions