2014-09-22 82 views
1

如何使用Levenshtein距離從列表中找到最符合stringstring文本框顯示最接近的匹配字符串

這是我的代碼:

{ 
    string basestring = "Coke 600ml"; 
    List<string> liststr = new List<string> 
    { 
     "ccoca cola", 
     "cola", 
     "coca cola 1L", 
     "coca cola 600", 
     "Coke 600ml", 
     "coca cola 600ml", 
    }; 

    Dictionary<string, int> resultset = new Dictionary<string, int>(); 
    foreach(string test in liststr) 
    { 
     resultset.Add(test, Ldis.Compute(basestring, test)); 
    } 

    int minimun = resultset.Min(c => c.Value); 

    var closest = resultset.Where(c => c.Value == minimun); 

    Textbox1.Text = closest.ToString();   
} 

在這個例子中,如果我運行代碼,我得到的列表中串號5 0的變化,所以我怎麼能在TextBoxstring本身顯示?

的爲例: 「可樂600毫升」 現在我只是TextBox返回:

System.Linq.Enumerable+WhereEnumerableIterator`1 
[System.Collections.Generic.KeyValuePair`2[System.String,System.Int32]] 

感謝。

+0

什麼是Ldis.Compute在幹什麼? – mybirthname 2014-09-22 03:57:14

+0

Ldis是我的Levenshtein距離類。 – 2014-09-22 20:40:53

回答

0

resultset.Where()返回一個列表,你應該使用

var closest = resultset.First(c => c.Value == minimun); 

選擇一個結果。

然後closestKeyValuePair<string, int>,所以你應該使用

Textbox1.Text = closest.Key; 

得到的字符串。 (您添加的字符串爲Key,更改計數爲Valueresultset越先進)

+0

謝謝!現在它按預期工作。 – 2014-09-22 21:27:42

1

試試這個

var closest = resultset.First(c => c.Value == minimun); 

您現有的代碼試圖顯示在文本框中的項目列表。我看起來像它應該只抓一個項目,其中價值==分鐘

0

它可以非常簡單,像這樣一個很好的解決方案:

var res = liststr.Select(x => new {Str = x, Dist = Ldis.Compute(basestring, x)}) 
       .OrderBy(x => x.Dist) 
       .Select(x => x.Str) 
       .ToArray(); 

這將命令從最相似到最不相似的字符串列表。 要獲得最相似的一個,只需將ToArray()替換爲First()即可。

簡短說明:

對於列表中的每個字符串,它創建一個包含原始字符串,它的距離,使用的LDI類計算的匿名類型。然後,它按距離排序集合並映射回原始字符串,以便失去爲排序計算的「額外」信息。

+0

我會試一試這段代碼。但現在我標記@陳夢龍爲答案。 – 2014-09-22 21:29:34

+0

謝謝,這段代碼也很好用。我只是將@Simon Chan標記爲答案,因爲這是對我的問題和代碼最快的方法。 – 2014-09-22 21:39:44