2014-09-22 3 views
1

Как я могу получить string из списка, который наилучшим образом соответствует базе string, используя расстояние Левенштейна.Строка отображения ближайшего соответствия TextBox

Это мой код:

{ 
    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 изменения в строки номер 5 из списка, так как я могу показать в TextBox сам string?

для Exemple: "Кокс 600мл" Сейчас моя TextBox просто возвращает:

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

Спасибо.

+0

Что такое Ldis.Compute? – mybirthname

+0

Ldis - мой дистанционный класс Левенштейна. –

ответ

0

resultset.Where() возвращает список, вы должны использовать

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

для выбора одного результата.

Тогда closest является KeyValuePair<string, int>, так что вы должны использовать

Textbox1.Text = closest.Key; 

, чтобы получить строку. (Вы добавили строку как Key и внесет изменения, как Value в resultset earilier)

+0

Спасибо! Теперь он работает так, как ожидалось. –

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().

Краткое объяснение:

Для каждой строки в списке, это создает анонимный тип, который содержит исходную строку, и это расстояние, вычисленное с помощью класса Ldis. Затем он заказывает коллекцию на расстоянии и отображает исходную строку, чтобы потерять «лишнюю» информацию, рассчитанную для заказа.

+0

Я дам этот код попробовать. Но пока я отметил @Simon Chan как ответ. –

+0

Спасибо, этот код также работает очень хорошо. Я просто отметил @Simon Chan как ответ, потому что это был самый быстрый подход к моему вопросу и коду. –

Смежные вопросы