如何使用Levenshtein距离从与string
基地最匹配的列表中获取string
。
这是我的代码:
{
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();
}
在此示例中,如果我运行代码,我会从列表中获得0号字符串中的0更改,那么如何在TextBox
string
本身中显示?
例如:&#34;可口可乐600ml&#34;现在我的TextBox
只返回:
System.Linq.Enumerable+WhereEnumerableIterator`1
[System.Collections.Generic.KeyValuePair`2[System.String,System.Int32]]
感谢。
答案 0 :(得分:1)
试试这个
var closest = resultset.First(c => c.Value == minimun);
您现有的代码正在尝试在文本框中显示项目列表。我看起来应该只抓一个值= = min
的项目答案 1 :(得分:0)
代码项目中有一个很好的解决方案 http://www.codeproject.com/Articles/36869/Fuzzy-Search
答案 2 :(得分: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()
。
简短说明:
对于列表中的每个字符串,它会创建一个匿名类型,其中包含使用Ldis类计算的原始字符串及其距离。然后,它按距离对集合进行排序并映射回原始字符串,以便失去&#34;额外的&#34;为订购计算的信息。
答案 3 :(得分:0)
resultset.Where()
返回一个列表,您应该使用
var closest = resultset.First(c => c.Value == minimun);
选择一个结果。
然后closest
是KeyValuePair<string, int>
,因此您应该使用
Textbox1.Text = closest.Key;
获取字符串。 (您将字符串添加为Key
并将计数更改为Value
至resultset
更早的时间)