如何在C#中以模糊方式使用String.Contains()?我有一个过滤时要搜索的人员列表。每次用户输入搜索字符串时都会应用过滤。有两个挑战需要考虑:用户可以输入部分名称用户可以输入错误第一个是通过搜索子字符串简单解决,例如String.Contains()。第二个可以通过使用模糊实现(例如https://fuzzystring.codeplex.com)来解决,但我不知道如何同时掌握这两个挑战。例如:我想在输入以下任何内容时查找“Dr.MartinFowler”:我想我需要编写一个“FuzzyContains()”逻辑来完成我需要的并且具有可接受的性能。任何建议如何开始?似乎是Levenshtein距离算法(数十种C#实现之一)的工作。您为该算法提供两个字符串(一个由用户输入,一个来自列表)。然后计算从第一个字符串到第二个字符串必须替换、添加或删除的字符数。然后你可以从列表中获取距离小于或等于3(例如)的所有元素,以查找简单的拼写错误。如果你有这个方法,你可以像这样使用它:varuserInput=textInput.Text.ToLower();varmatchingEmployees=EmployeeList.Where(x=>x.Name.ToLower().Contains(userInput)||LevenshteinDistance.Compute(x.Name.ToLower(),userInput)我修改了Oliver的回答,提出了Levenshtein距离算法,它这不是最好的选择,因为当只输入部分名称时,计算的距离很大。所以,我最终使用了由很棒的FuzzyStringLib实现的最长公共子序列算法。常量公差=1;字符串userInput=textInput.Text.ToLower();varmatchingPeople=people.Where(p=>{//检查包含boolcontains=p.Name.ToLower().Contains(userInput);if(contains)returntrue;//检查LongestCommonSubsequenceboolsubsequenceTolerated=p.Name.LongestCommonSubsequence(userInput).Length>=userInput.Length-TOLERANCE;returnsubsequenceTolerated;}).ToList();我以前做过这个,并开始使用维基百科上列出的一些方法进行近似字符串匹配。完成后,我以一种不通用的方式调整了我的算法,但在我的领域中提供了更好的匹配。如果你的整个字典都在内存中并且不是太大,你可以简单地对字典的每个成员应用一个匹配算法。如果你的字典很大,这可能会过度使用你的资源,你将需要一个更好的算法。您可能还想考虑使用数据库的全文搜索功能。在我的例子中,我遍历字典中的每个字符串,比较“匹配运行”,即2个点表示2个字符匹配,3个点表示3个字符匹配,最多8个字符匹配。我遍历了所有可能的对、三元组等——对每个字典条目进行评分并选择得分最高的匹配项。容忍拼写错误、词序等,但计算量大——我的词典有几千个短语,所以这对我来说完全没问题。这是Dice系数的修改版本。也许您可以使用这个soundex实现:CodeProjectsoundex所做的是比较两个字符串并计算“发音相似度”的百分比。前段时间,我借助此功能(内置PHP)构建了一个搜索在其他语言(如Python)中,我们具有很酷的文本处理功能,包括距离计算。有一些算法,例如Levenshtein,可以计算两个字符串之间的模糊距离。我在C#中看到了一些实现(此处),另一个模块是difflib,此处。这些算法的输出是一个数字。越接近0越好。前段时间我有一个学校项目,我们有一个文本框,学生可以在其中搜索每个员工,学生与学校有关。我们正在谈论数百人。我们在Corei3处理器上使用的简单Linq查询非常快。每次用户在文本框中键入时都会调用此查询。在TextChanged事件中,我们调用如下所示的查询:varresultData=EmployeeList.Where(x=>x.Name.ToLower().Contains(textInput.Text.ToLower())).ToList();当然,这个逻辑只适用于属性或成员中有“Dr.MartinFowler”的情况。你试过蛮力吗?最简单的方法是从头开始将搜索字符串与目标字符串的子字符串进行匹配,然后从所有匹配项中获取最接近的匹配项。但从性能的角度来看,这可能是不可接受的。以上就是C#学习教程:HowtoString.Contains()thefuzzywayinC#?如果分享的所有内容对您有用,需要了解更多C#学习教程,希望您多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
