您想使用两个单词之间的Levenshtein 距离,但我假设您知道这一点,因为这就是问题标签所说的。
您必须遍历您的列表(假设)并将列表中的每个单词与您正在执行的当前查询进行比较。你可以建立一个BK-tree来限制你的搜索空间,但是如果你只有大约 3000 个单词,这听起来有点矫枉过正。
var upperLimit = 2;
var allWords = GetAllWords();
var matchingWords = allWords
.Where(word => Levenshtein(query, word) <= upperLimit)
.ToList();
在编辑原始问题后添加
如果您有不区分大小写的字典,则查找距离 = 0 的情况很容易包含查询。距离 <= 2 的情况需要对搜索空间进行完整扫描,每个查询词进行 3000 次比较。假设相同数量的查询词将导致 900 万次比较。
您提到它超时,所以我认为您配置了超时?您的速度可能是由于 Levenshtein 计算的实施不佳或缓慢吗?

(来源:itu.edu.tr)
上图是从CLiki 窃取的:bk-tree
正如所见,使用编辑距离 <= 2 的 bk-tree 只会访问大约 1% 的搜索空间,但这是假设您有非常大的输入数据,在他们的情况下多达 50 万个单词。在您的情况下,我会假设类似的数字,但是即使存储在列表/字典中,如此少量的输入也不会造成太大的麻烦。