Найти ближайшее совпадение строки - PullRequest
4 голосов
/ 05 ноября 2010

C # WinApp: допустим, я ищу dtg, но я ищу dvg, dz, dxg ... поэтому я хочу, чтобы он нашел для меня dvg, потому что он ближе к dtg, который я искал.Я знаю, что есть некоторые NP-сложные алгоритмы для этого, но на самом деле я не хочу тратить на это кучу времени.есть ли методы String, которые делают что-то близкое к этому?или можете сделать это с помощью нескольких дополнительных кодов?

Ответы [ 3 ]

8 голосов
/ 05 ноября 2010

Вам потребуется метрика, описывающая разницу между двумя строками. Обычный подход заключается в использовании расстояния Левенштейна , которое быстро реализуется с использованием нескольких строк кода C # (файлы кодов доступны онлайн).

1 голос
/ 05 ноября 2010

Вы хотите использовать Soundex.Если я смогу найти ссылку на какой-нибудь код, я дам вам немного.Я сделал проверку орфографии с использованием Soundexes, и это именно то, что вы ищете.

Тем временем, этот поиск в Google должен помочь:

http://www.google.com/search?q=C%23+soundex&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a

Вотхорошая реализация C #: http://www.builderau.com.au/program/csharp/print.htm?TYPE=story&AT=339291792-339028385t-320002002c

0 голосов
/ 02 октября 2012
public static string ClosestWord(string word, string[] terms)
{
    string term = word.ToLower();
    List<string> list = terms.ToList();
    if (list.Contains(term))
        return list.Find(t => t.ToLower() == term);
    else
    {
        int[] counter = new int[terms.Length];
        for (int i = 0; i < terms.Length; i++)
        {
            for (int x = 0; x < Math.Min(term.Length, terms[i].Length); x++)
            {
                int difference = Math.Abs(term[x] - terms[i][x]);
                counter[i] += difference;
            }
        }

        int min = counter.Min();
        int index = counter.ToList().FindIndex(t => t == min);
        return terms[index];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...