Linq语句所需的Linq通配符和NOT条件



我在为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个或更多个字符。

如果需要部分匹配,请移除锚点^$

如果varFirstvarThird可以包含特殊的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);
}
}

如果您希望varFirstvarThirdPolicy完全匹配:

var x = vidaBiliy.SponsorPackage.FirstOrDefault(s => 
s.Policy.IsIn(varFirst, varThird) &&
Regex.IsMatch(s.Policy, varSecond));

如果您希望varFirstvarThird中的一个与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));

注意:您不需要应用WhereFirstOrDefault,但可以将它们组合为一种方法。

最新更新