2013-05-13 23 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#

這可能是你的問題矯枉過正,但它應該完成這項工作。