为了避免混淆,我说的是 linq to object 而不是别的。我在内存中处理很多对象,我需要过滤它们。我们有一个包含许多选项的屏幕,用户可以在其中选择许多值。
我需要在 sql 中实现类似于“Like”运算符的东西。我确实在这个网站上找到了一篇关于它的帖子并使用了正则表达式,但我从未使用过它。我想知道我的字符串模式是否正确。不应该使用“%”“%”吗?
我还读到你应该使用 startWith -endWith 和 contains 的组合,但我还没有找到任何使用所有它们组合的例子,只是为了感受一下如何去做。
我是这样做的
string pattern = string.Format(".*{0}.*", criteria.SearchText);
myList= myList.Where(x => x.Message.Like(pattern)).ToList();
public static bool Like(this string s, string pattern, RegexOptions options = RegexOptions.IgnoreCase)
{
return Regex.IsMatch(s, pattern, options);
}
任何建议
如果你想检查一个字符串是否包含另一个你可以使用:
myList = myList.Where(x => x.Message.Contains(criteria.SearchText)).ToList();
或
myList = myList.Where(x => x.Message.IndexOf(criteria.SearchText) != -1).ToList();
(第二个变体很好,因为使用 IndexOf
您可以指定 CultureInfo
)
如果你想在 Regex
中混合一个用户定义的词,你应该使用 Regex.Escape()
来转义它,这样如果用户写 a*
,搜索到的文本是a*
,而不是任意数量的a
。
string pattern = string.Format(".*{0}.*", Regex.Escape(criteria.SearchText));
但请注意,按照书面形式,它等同于:
string pattern = string.Format("{0}", Regex.Escape(criteria.SearchText));
因为您没有为您的正则表达式添加 anchor ,所以正则表达式将在字符串中的任何位置进行搜索。
如果你想锚定用户定义的词,比如你想搜索以
开头的词
string pattern = string.Format("^{0}", Regex.Escape(criteria.SearchText));
或结束于
string pattern = string.Format("{0}$", Regex.Escape(criteria.SearchText));
我是一名优秀的程序员,十分优秀!