您可以創建一個名爲「ContainsFuzzy」自定義擴展方法:
public static bool ContainsFuzzy(this string target, string text){
// do the cheap stuff first
if (target == text) return true;
if (target.Contains(text)) return true;
// if the above don't return true, then do the more expensive stuff
// such as splitting up the string or using a regex
}
那麼你的LINQ至少會更容易閱讀:
var objects = from x in db.Foo
where x.Name.ContainsFuzzy("Foo McFoo")
select x;
明顯的缺點是每次調用ContainsFuzzy意味着重新創建您的分割列表等,因此會涉及一些開銷。你可以創建一個名爲FuzzySearch類至少能給你一些增加效益分析:
class FuzzySearch{
private string _searchTerm;
private string[] _searchTerms;
private Regex _searchPattern;
public FuzzySearch(string searchTerm){
_searchTerm = searchTerm;
_searchTerms = searchTerm.Split(new Char[] { ' ' });
_searchPattern = new Regex(
"(?i)(?=.*" + String.Join(")(?=.*", _searchTerms) + ")");
}
public bool IsMatch(string value){
// do the cheap stuff first
if (_searchTerm == value) return true;
if (value.Contains(_searchTerm)) return true;
// if the above don't return true, then do the more expensive stuff
if (_searchPattern.IsMatch(value)) return true;
// etc.
}
}
你的LINQ:
FuzzySearch _fuzz = new FuzzySearch("Foo McFoo");
var objects = from x in db.Foo
where _fuzz.IsMatch(x.Name)
select x;
來源
2012-10-31 17:23:25
JDB
你知道白色空間string.split以打散搜索字符串和然後只需運行多個查詢。包含並返回所有結果? –
如果有「John Smith」會怎麼樣?你是否將它分割並搜索名稱的每個部分?什麼使首字母和姓?我所知道的是,在目前的形式下,這個名字看起來沒有結構。 – hometoast