C# 文本框显示最接近的匹配字符串
如何使用Levenshtein距离从与基本C# 文本框显示最接近的匹配字符串,c#,string,textbox,C#,String,Textbox,如何使用Levenshtein距离从与基本字符串最匹配的列表中获取字符串 这是我的代码: { string basestring = "Coke 600ml"; List<string> liststr = new List<string> { "ccoca cola", "cola", "coca cola 1L", "coca cola 600", "Coke 60
字符串
最匹配的列表中获取字符串
这是我的代码:
{
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();
}
谢谢。试试这个
var closest = resultset.First(c => c.Value == minimun);
您的现有代码正在尝试在文本框中显示项目列表。我觉得它应该只获取一个项目,其中Value==min在代码项目中有一个很好的解决方案
可以非常简化,如下所示:
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类计算。然后,它按距离对集合排序并映射回原始字符串,以便丢失为排序计算的“额外”信息。resultset。其中()
返回列表,您应该使用
var closest = resultset.First(c => c.Value == minimun);
选择单个结果
然后最接近的是KeyValuePair
,因此您应该使用
Textbox1.Text = closest.Key;
去拿绳子。(您将字符串添加为Key
并将计数更改为Value
到resultset
earilier)Ldis.Compute在做什么?Ldis是我的Levenshtein距离类。我将尝试使用此代码。但是现在我把@Simon Chan标记为答案。谢谢,这段代码也很有效。我只是把@Simon Chan作为答案,因为这是解决我的问题和代码的最快方法。
Textbox1.Text = closest.Key;