如何在c#net 4.0上进行音译?

如何在c#net 4.0上进行音译?,c#,.net-4.0,C#,.net 4.0,我是编程新手。这是我的代码: public string ThanglishToTamilList(char[] characters, int length) { var dict1 = new Dictionary<string, string>(); dict1.Add("a", "\u0B85"); // அ dict1.Add("aa", "\u0B86"); // ஆ dict1.Add("A", "\

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

  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;
    }
公共字符串thanglishtamillist(字符[]个字符,整数长度){
var dict1=新字典();
第1条.添加(“a”,“\u0B85”);//அ
第1条添加(“aa”,“u0B86”);//ஆ
第1条添加(“A”,“\u0B86”);//ஆ
第1条添加(“i”,“u0B87”);//இ
第1条添加(“ee”,“u0B88”);//ஈ
第1条添加(“I”,“u0B88”);//ஈ
第1条添加(“u”,“u0B89”);//உ
...
列表=新列表();
字符串[]数组;
Dictone的var值=”;
for(int i=0;i
功能参数详细信息:

  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[]字符:字符数组(textbox.text.ToCharArray())

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

我的预期输出应该是:

  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;
    }
如果用户键入->输出,则应为அ.

同样地:

a->அ

aa->ஆ

A->ஆ

请注意,aa和A表示相同的值ஆ

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

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

aa->அஅ

但是我需要正确的输出

aa->ஆ

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

        ...
        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());
            }
        }
。。。
for(int i=0;i

请帮助我纠正这段代码,或者请提供任何简单的音译方法


谢谢。

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

我认为您应该做的是,只要有有效的字典条目,就向某个临时字符串添加字符。如果附加到此临时字符串的下一个字符在字典中不存在,则您将处理字符串替换并从新的临时字符串开始。
当然,这个解决方案在某些方面并不理想-如果我们有string
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]);
}

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

我认为您应该做的是,只要有有效的字典条目,就向某个临时字符串添加字符。如果附加到此临时字符串的下一个字符在字典中不存在,则您将处理字符串替换并从新的临时字符串开始。
当然,这个解决方案在某些方面并不理想-如果我们有string
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]);
}

您可以使用一个简单的解析器/词法分析器来标记输入字符串。然后您的
thanglishtamillist
函数如下所示:

...
TextReader r = new StringReader(characters);
Lexer l = new Lexer(r, defs);
while (l.Next())
{
  list.Add(dict1[l.TokenContents]);
}
...
您可以在这里找到一个简单解析器/词法分析器的示例:


对于您的问题来说,这可能有些过分,但它应该可以完成工作。

您可以使用一个简单的解析器/词法分析器来标记输入字符串。然后,您的
thanglishtamillist
函数如下所示:

...
TextReader r = new StringReader(characters);
Lexer l = new Lexer(r, defs);
while (l.Next())
{
  list.Add(dict1[l.TokenContents]);
}
...
您可以在这里找到一个简单解析器/词法分析器的示例:


对于您的问题来说,这可能有点过头了,但它应该可以完成任务。

您是否有一个keydown/keypress事件调用整个事件?如果是这样的话,它可能只是两次调用您的函数“a”…1