1

我是编程新手。这是我的代码:

  public string ThanglishToTamilList(char[] characters, int length) {
        var dict1 = new Dictionary<string, string>();

        dict1.Add("a", "\u0B85"); // அ
        dict1.Add("aa", "\u0B86"); // ஆ
        dict1.Add("A", "\u0B86"); // ஆ
        dict1.Add("i", "\u0B87"); // இ
        dict1.Add("ee", "\u0B88"); // ஈ
        dict1.Add("I", "\u0B88"); // ஈ
        dict1.Add("u", "\u0B89"); // உ
        ...



        List<String> list = new List<String>();
        string[] array;
        var valueOfDictOne = "";

        for (int i = 0; i < length; i++)
        {                
            try
            {
                valueOfDictOne = dict1[characters[i].ToString()];
                list.Add(valueOfDictOne);

            }
            catch
            {
                list.Add(characters[i].ToString());
            }
        }

        array = list.ToArray();
        string result = string.Join("", array);
        return result;
    }

功能参数详情:

char[] characters : 字符数组 (textbox.text.ToCharArray())

int length :数组的长度。(我们在文本框中输入的字符数)

我的预期输出应该是:

如果用户键入a -> 输出应该是அ。

同样地:

一个->அ</p>

aa -> ஆ</p>

A -> ஆ ...

注意 aa 和 A 代表相同的ஆ</p>

我的问题: 此代码仅替换一个字符(a -> அ),这很好用。

但是如果我们输入 aa 输出是 அஅ

aa -> அஅ

但我需要正确的输出

aa -> ஆ</p>

我为此添加了一些代码行。但这不起作用:

        ...
        for (int i = 0; i < length; i++)
        {                
            try
            {

                if (String.Equals(characters[i], "a") && !(String.Equals(characters[i], "aa")))
                {

                    //MessageBox.Show("a");

                    valueOfDictOne = dict1[characters[i].ToString()];
                    list.Add(valueOfDictOne);
                }
                else if (String.Equals(characters[i], "aa"))
                {
                    //MessageBox.Show("aa");

                    valueOfDictOne = dict1[characters[i].ToString()];
                    list.Add(valueOfDictOne);
                }

            }
            catch
            {
                list.Add(characters[i].ToString());
            }
        }

...

请帮助我更正此代码或提供任何简单的替代音译方法。

谢谢你。

4

2 回答 2

1

您可以使用简单的解析器/词法分析器来标记输入字符串。那么你的ThanglishToTamilList功能将是:

...
TextReader r = new StringReader(characters);
Lexer l = new Lexer(r, defs);
while (l.Next())
{
  list.Add(dict1[l.TokenContents]);
}
...

你可以在这里找到一个简单的解析器/词法分析器的例子: Poor man's "lexer" for C#

对于您的问题来说,这可能是矫枉过正,但它应该可以完成工作。

于 2013-05-13T08:45:14.257 回答
0

我认为你应该彻底改变你的方法来有效地解决这个问题。基于一个字符会给您带来无效的结果,因为某些序列以字典中已经存在的有效序列开头。

我认为你应该做的就是在一些临时字符串中添加字符,只要有有效的字典条目。如果附加到此临时字符串的下一个字符不会出现在字典中,那么您将处理字符串替换并从新的临时字符串开始。
当然,这个解决方案在某些方面并不完美——如果我们有字符串aaa,应该如何处理它?解决方案假定首先采用最长匹配表达式(第一点),但这不是必要的有效方法。

  • aa+ a?
  • a+ aa?
  • a+ a+ a?

但是您需要在业务层面以某种方式解决这个问题。

下面的示例伪代码:

foreach(char character in characters)
{
    if (!substitutionDict.ContainsKey(tempString + character))
    {
        makeSubstitution(tempString, substitutionDict[tempString]);
        tempString = String.Empty;
    }
    tempString += character;
}

编辑:
这种方法主要适用于打字时的处理。我不确定这种解决方案对于较长文件的性能。在处理已经创建的文件时,最好换一种方式看待它:寻找模式并替换它们。

foreach (string pattern in substitutionDict.Keys.OrderByDesc(x => x.Length))
{
    makeSubstitution(pattern, substitutionDict[pattern]);
}
于 2013-05-13T08:26:52.493 回答