C# 文本框显示最接近的匹配字符串

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

如何使用Levenshtein距离从与基本
字符串
最匹配的列表中获取
字符串

这是我的代码:

{
    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;