TextBox显示最接近的匹配字符串

时间:2014-09-22 03:41:37

标签: c# string textbox

如何使用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]]

感谢。

4 个答案:

答案 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); 

选择一个结果。

然后closestKeyValuePair<string, int>,因此您应该使用

Textbox1.Text = closest.Key;

获取字符串。 (您将字符串添加为Key并将计数更改为Valueresultset更早的时间)