2013-05-13 46 views
1

我是编程新手。这些是我的代码:如何在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", "\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; 
    } 

功能参数细节:

炭[]字符:字符阵列(textbox.text.ToCharArray())

INT长度:长度阵列。 (字符,我们在文本框中键入)

我预期的输出应该是:

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

同样:

一个 - >அ

AA - >ஆ

A - >ஆ ...

注意,AA &一个代表相同ஆ

我的问题: 此代码只取代一个字符(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()); 
      } 
     } 

...

请帮我解决这个代码或请提供任何简单的替代方式音译。

谢谢。

+0

你是否有这样的事情被keydown/keypress事件调用?如果是这样 - 它可能只是调用你的函数两次'...' – 2013-05-13 07:57:07

+1

我认为'String.Equals(character [i],“aa”)'将永远是错误的,因为一个字符永远不会等于两个字符 – Pako 2013-05-13 08:18:17

+0

1.尽管您已经添加了一些代码行,但第二个代码片段与第一个代码片段完全相同。 2.你在这里指定的代码没有问题。请检查您传递给此方法的参数。 – neo 2013-05-13 08:10:15

回答

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

编辑:
呈现这种方法主要是sutable进行处理的同时输入。我不确定这些解决方案对更长文件的性能。在处理已经创建的文件时,反过来看看它可能会更好:查找模式并替换它们。

foreach (string pattern in substitutionDict.Keys.OrderByDesc(x => x.Length)) 
{ 
    makeSubstitution(pattern, substitutionDict[pattern]); 
} 
+0

是否有可用于音译的.dll文件? – 2013-05-13 13:36:11

+0

从来没有这样做,所以不知道。 http://stackoverflow.com/questions/10027001/does-net-transliteration-library-exists这可能是你在找什么。如果没有 - 谷歌,可能有东西。如果你的要求不复杂 - 创建自己的东西不会那么难 – Pako 2013-05-13 19:12:51

+0

好的,谢谢。 :) – 2013-05-14 03:56:39

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#

这可能是你的问题矫枉过正,但它应该完成这项工作。