匹配两个数组索引 - c#/ Windows Phone 7

时间:2012-06-24 15:36:19

标签: c# arrays windows-phone-7

我正在尝试创建一个代替另一个角色的程序。我创建了两个数组,奇数和偶数如下:

char[] odd = { 'a', 'c', 'e', 'g', 'i', 'k', 'm', 'o', 'q', 's', 'u', 'w', 'y' };
char[] even ={ 'b', 'd', 'f', 'h', 'j', 'l', 'n', 'p', 'r', 't', 'v', 'x', 'z' };

现在,如果输入是'a',则必须输入'b',如果输入为'b',它必须打印'a'

所以我认为最好匹配两个数组的索引,因为它们具有相同的计数。基本的想法是:

输入是'a',因此编译器会将'a' - 0的索引考虑在内,并使用索引0替换该值 - < EM> 'b'。

所以我考虑分配一个备用字符'j',它将找到输入的索引并输出数组中相应的字符 - even[]

我尝试了几次但无法得到解决方案。请帮助我...

这是我尝试过的。

所需的输入可能是这样的:你好 所需的输出应为:Gfkkp

据说这给了我想要的结果。

private void superSecretFormula(string myName)  
{
    string read = myName;
    int count = read.Length;

    char[] odd = { 'a', 'c', 'e', 'g', 'i', 'k', 'm', 'o', 'q', 's', 'u', 'w', 'y' };
    //char[] j;

    char[] even = { 'b', 'd', 'f', 'h', 'j', 'l', 'n', 'p', 'r', 't', 'v', 'x', 'z' };
    for (int i = 0; i < count; i++)
    {
        for (int j = 0; j < 13 ; j++)
        {
            if (read[i]==odd[j])
            {
                int k = j;
                textBlock1.Text = textBlock1.Text + Convert.ToString(char.ToUpperInvariant(even[k]));
            }
            if (read[i] == even[j])
            {
                int k = j;
                textBlock1.Text = textBlock1.Text + Convert.ToString(char.ToUpperInvariant(odd[k]));
            }
        }
    }
}

请注意解决这个问题的质量和方法,因为我是新手,我现在才开始学习代码。感谢

4 个答案:

答案 0 :(得分:4)

假设您的所有替换都是唯一的,我会考虑将您的结构更改为类似的内容以便于使用。

class Program
{
    static void Main(string[] args)
    {
        var subs = new Substitutes {{'a', 'b'}, {'c', 'd'}};

        Console.WriteLine(subs['a']); //Prints b
        Console.WriteLine(subs['b']); //Prints a
    }

    class Substitutes : Dictionary<char, char>
    {
         public new void Add(char item, char substitute)
         {
             base.Add(item, substitute);
             base.Add(substitute, item);
         }
    }
}

现在,通过检查密钥是否存在,替换字符串中的所有字符将是微不足道的。

答案 1 :(得分:0)

我不确切知道你需要帮助的地方。一个小函数,用odd中相应的字符串替换even中包含的字符串的每个字符,反之亦然,如下所示:

static char[] odd = { 'a', 'c', 'e', 'g', 'i', 'k', 'm', 'o', 'q', 's', 'u', 'w', 'y' };
static char[] even = { 'b', 'd', 'f', 'h', 'j', 'l', 'n', 'p', 'r', 't', 'v', 'x', 'z' };

static string Substitute(string input)
{
    char[] result = new char[input.Length];
    int i = 0;
    bool found = false;
    foreach (char c in input.ToCharArray())
    {
        found = false;
        result[i] = c;
        for (int j = 0; j < odd.Length; j++)
        {
            if (odd[j] == c)
            {
                result[i] = even[j];
                found = true;
                break;
            }
        }

        if (!found)
        {
            for (int j = 0; j < even.Length; j++)
            {
                if (even[j] == c)
                {
                    result[i] = odd[j];
                    break;
                }
            }
        }
        i++;
    }
    return new string(result);
}

您还可以通过创建从每个输入字符到输出字符的某种映射来优化它,只需创建一次并缓存然后:

static char[] odd = { 'a', 'c', 'e', 'g', 'i', 'k', 'm', 'o', 'q', 's', 'u', 'w', 'y' };
static char[] even = { 'b', 'd', 'f', 'h', 'j', 'l', 'n', 'p', 'r', 't', 'v', 'x', 'z' };
static int[] mapping = null;

static string Substitute(string input)
{
    if (mapping == null)
    {
        mapping = new int[Math.Max(odd.Select(x => (int)x).Max(), even.Select(x => (int)x).Max()) + 1];

        for (int i = 0; i < mapping.Length; i++) mapping[i] = i;

        // Note: Make sure 'odd' and 'even' are arrays of the same length
        for (int i = 0; i < odd.Length; i++) mapping[(int)odd[i]] = (int)even[i];
        for (int i = 0; i < even.Length; i++) mapping[(int)even[i]] = (int)odd[i];
    }

    char[] result = new char[input.Length];
    int j = 0;
    foreach (char c in input.ToCharArray())
    {
        int charcode = (int)c;
        result[j] = charcode >= mapping.Length ? c : (char)mapping[charcode];
        j++;
    }
    return new string(result);
}

答案 2 :(得分:0)

以最少的修改坚持你原来的想法。

Array.IndexOf(odd, 'a'); //will return 0
Array.IndexOf(odd, 'b')' //will return -1

左右....

if(Array.IndexOf(odd, inputChar) > -1 )
{
    Console.WriteLine(even[Array.IndexOf(odd, inputChar)]);
}
else
{
    Console.WriteLine(odd[Array.IndexOf(even, inputChar)]);
}

文档: http://msdn.microsoft.com/en-us/library/eha9t187.aspx

答案 3 :(得分:0)

一种方法是创建一个类,该类保存对包含应该转置的字母的两个字典的引用;类似于OP的原始两个阵列。然后创建一个转换输入字符串的方法:

public class TransposeLetters
{
    public Dictionary<char, char> Odd { get; private set; }
    public Dictionary<char, char> Even { get; private set; }

    public TransposeLetters()
    {
        Odd = new Dictionary<char, char>();

        // capital leters
        for( int i = 65; i <= 90; i += 2 )
        {
            Odd.Add( (char)i, (char)( i + 1 ) );
        }

        // small letters
        for( int i = 97; i <= 122; i += 2 )
        {
            Odd.Add( (char)i, (char)( i + 1 ) );
        }

        Even = Odd.ToDictionary( x => x.Value, x => x.Key );
    }

    public string Convert( string str )
    {
        // ensure only letters are passed into the method
        var cleansed = str.Where( char.IsLetter );

        var transposed = cleansed.Select( x => Odd.ContainsKey( x ) ? Odd[x] : Even[x] );

        var result = new string( transposed.ToArray() );

        return result;
    }
}