我在为LINQ寻找一些通配符,但运气不佳
本质上存在一个for循环,其中这些变量将改变
varFirst = "ABC"
varSecond = "DEF"
varThird = "GHI"
因此,对于通配符搜索,我希望确保varFirst和varThird匹配,但varSecond是通配符,可以是任何值。
我在看regex,但我很难理解如何做到这一点。
var x = vidaBiliy.SponsorPackage.Where(s => s.Policy == varFirst + varSecond + varThird ).FirstOrDefault()
因此,在对数据进行循环时,我在上面有一个查询,它连接了这3个变量(在此之前,它们会根据循环中的值进行更改。因此,在这种情况下,我只希望varFirst和varThird完全匹配……但varSecond可以是任何值。我想规范使用***,但这只是意味着允许任何值
我在看regEx.IsMatch(项(,但我想知道如何实现这一点。
然后我需要另一张";搜索NOT条件";
我是想得太多了还是没有足够的信息?
如果只需要保留Policy
属性以varFirst
开头、以varThird
结尾的项,则可以使用
.Where(s => Regex.IsMatch(s.Policy, $"^{Regex.Escape(varFirst)}.*{Regex.Escape(varThird)}$"))
这将创建一个类似于^ABC.*DEF$
的正则表达式,并将匹配以ABC
开头、以DEF
结尾的任何字符串,其中除了换行符之外,还有任何0个或更多个字符。
如果需要部分匹配,请移除锚点^
和$
。
如果varFirst
和varThird
可以包含特殊的regex元字符,如(
或[
,则需要Regex.Escape
方法,这些字符必须按字面匹配。
首先,让我们创建一个方便的方法来接受您的强制参数:
public static class StringUtils
{
public static bool IsIn(this string source, params string[] values)
{
return values.Contains(source);
}
public static bool IsAny(this string source, params string[] values)
{
return values.Any(v => v.Contains(source));
}
public static bool WhenAll(this string source, params string[] values)
{
return values.All(source.Contains);
}
}
如果您希望varFirst
和varThird
与Policy
完全匹配:
var x = vidaBiliy.SponsorPackage.FirstOrDefault(s =>
s.Policy.IsIn(varFirst, varThird) &&
Regex.IsMatch(s.Policy, varSecond));
如果您希望varFirst
和varThird
中的一个与Policy
完全匹配:
var x = vidaBiliy.SponsorPackage.FirstOrDefault(s =>
s.Policy.IsAny(varFirst, varThird) &&
Regex.IsMatch(s.Policy, varSecond));
当你想要";ABC123GHI";(Policy
(以包含";ABC";(varFirst
(和";GHI";(varThird
(并且可选地匹配Regex
(varSecond
(:
var x = vidaBiliy.SponsorPackage.FirstOrDefault(s =>
s.Policy.WhenAll(varFirst, varThird) &&
Regex.IsMatch(s.Policy, varSecond));
注意:您不需要应用Where
和FirstOrDefault
,但可以将它们组合为一种方法。