2010-11-04 192 views
4

C#WinApp:比方說,我搜索dtg,但我搜索的項目是dvg,dz,dxg ...所以我希望它爲我找到dvg,因爲它更接近dtg我正在尋找。 我知道這裏有一些NP-hard算法,但我真的不想在這上面花費大量的時間。有沒有什麼字符串方法可以做到接近這個?或者可以用一些額外的代碼留下來做到這一點?查找最近的字符串匹配

+1

字符串之間的相似性/鄰近性的確切定義是什麼?還是有什麼好的,可以給你一些措施? – 2010-11-05 00:03:04

+0

所以對於我上面的示例,字符串列表和我正在查找的字符串都以「d」開頭......但我的搜索字符串的下一個字符是「t」...在該列表中,「t」更靠近到「v」比「z」或「x」,所以我選擇「dvg」搜索「dtg」 – Bohn 2010-11-05 00:08:01

回答

1

你想使用Soundex。如果我能找到一些代碼的鏈接,我會給你一些。我用Soundexes做了一個拼寫檢查器,而這正是你要找的。

在此期間,該谷歌搜索應該有所幫助:

http://www.google.com/search?q=C%23+soundex&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a

這裏有一個很好的C#實現:http://www.builderau.com.au/program/csharp/print.htm?TYPE=story&AT=339291792-339028385t-320002002c

+0

謝謝,我會研究它,請讓我知道,如果你找到它的結果。 – Bohn 2010-11-05 00:11:33

8

你需要一個指標描述兩個字符串之間的區別。一種常用的方法是使用Levenshtein distance,它使用幾行C#代碼快速實現(代碼文件可在線獲取)。

+0

我找到了一個MSDN的weblog實現。但整個算法不是我所需要的......好吧,我正在搜索「B」,並在列表中有「AK」和「BOB」,猜猜看是什麼?算法正在選擇「AK」...補充!至少只是爲了「BOB」,因爲它們都以它開頭....我的意思是實現是正確的,但算法本身不是我正在尋找的 – Bohn 2010-11-05 16:36:22

0
public static string ClosestWord(string word, string[] terms) 
{ 
    string term = word.ToLower(); 
    List<string> list = terms.ToList(); 
    if (list.Contains(term)) 
     return list.Find(t => t.ToLower() == term); 
    else 
    { 
     int[] counter = new int[terms.Length]; 
     for (int i = 0; i < terms.Length; i++) 
     { 
      for (int x = 0; x < Math.Min(term.Length, terms[i].Length); x++) 
      { 
       int difference = Math.Abs(term[x] - terms[i][x]); 
       counter[i] += difference; 
      } 
     } 

     int min = counter.Min(); 
     int index = counter.ToList().FindIndex(t => t == min); 
     return terms[index]; 
    } 
} 
+0

請不要在沒有解釋的情況下發布代碼 – Cybermaxs 2012-10-02 12:23:28