C# Linq通配符,而不是Linq语句所需的条件
我在为LINQ寻找一些通配符,但运气不太好 本质上有一个for循环,在这个循环中,这些变量将发生变化C# Linq通配符,而不是Linq语句所需的条件,c#,.net,regex,linq,C#,.net,Regex,Linq,我在为LINQ寻找一些通配符,但运气不太好 本质上有一个for循环,在这个循环中,这些变量将发生变化 varFirst = "ABC" varSecond = "DEF" varThird = "GHI" 所以对于我的通配符搜索,我想确保varFirst和varThird匹配,但是varSecond是通配符,可以是任何东西 我在看regex,但我很难理解怎么做 var x = vidaBiliy.SponsorPackage.Wh
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(item),但我想知道如何实现这一点
然后我需要另一个检查“DoSearchfortheNot条件”
我是想得太多了还是没有足够的信息?首先,让我们创建一个方便的方法来接受您的强制参数:
公共静态类StringUtils
{
公共静态布尔IsIn(此字符串源,参数字符串[]值)
{
返回值。包含(源);
}
公共静态bool IsAny(此字符串源,参数字符串[]值)
{
返回值.Any(v=>v.Contains(source));
}
公共静态bool WhenAll(此字符串源,参数字符串[]值)
{
返回值.All(source.Contains);
}
}
如果您希望varFirst
和varThird
与策略
完全匹配:
var x=vidaBiliy.SponsorPackage.FirstOrDefault(s=>
s、 Policy.IsIn(varFirst,varThird)&&
Regex.IsMatch(s.Policy,varSecond));
如果您希望启用varFirst
和varThird
以精确匹配策略
:
var x=vidaBiliy.SponsorPackage.FirstOrDefault(s=>
s、 政策。伊萨尼(第一,第三)&&
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
应用到一个方法中,但可以将它们组合到一个方法中。如果您只需要保留Policy
属性以varFirst
开头,以varThird
结尾的项,您可以使用
.Where(s => Regex.IsMatch(s.Policy, $"^{Regex.Escape(varFirst)}.*{Regex.Escape(varThird)}$"))
这将创建一个类似于^ABC.*DEF$
的正则表达式,并将匹配任何以ABC
开头、以DEF
结尾的字符串,其中包含除换行符以外的任何0个或更多字符
如果需要部分匹配,请删除锚定、^
和$
如果
varFirst
和varThird
可以包含特殊的正则表达式元字符,如(
或[
,必须逐字匹配。其中(s=>Regex.IsMatch(s.Policy,$“{varFirst}.{varThird}”))
?享受其他选项的乐趣var arr=s.Policy.split(varSecond);arr[0].constains(varFirst);arr[2].constains(varThird)
@WiktorStribiżew所以如果s.Policy==varFirst+varSecond+varThird,在你的例子中-varSecond在哪里?但是你说varSecond
应该匹配任何东西,因此,我使用了*
-尽可能多地匹配除换行符以外的任何0个或更多字符。或者你的意思是需要Regex.Escape
第一个字符第三个参数是什么?Where(s=>Regex.IsMatch(s.Policy,$“{Regex.Escape(varFirst)}{varSecond}{Regex.Escape(varThird)}”)
@Dalorzo所以在你的例子中,我会分割varSecond,但是s.Policy不存在于linq where子句之外,并且约束mean exact?当它循环时,一个查询正在寻找组合匹配,其中通配符表示中间不重要。因此,如果在循环中varFirst=ABC,varSecond=DEF和varThird=GHI,那么如果s.Policy=ABC123GHI,然后它通过ok和中间(秒)可以是任何东西。我不知道IsIn和IsAny之间的区别…所以varFirst和varThird必须是精确匹配的,但是varSecond可以是任何东西-所以我担心哪两个都是最后一个queries@JeremyMiller,我想我的上一次更新时所有的都应该与你最后的评论输出相匹配。请检查。第一个和第三个应该是匹配的,第二个是通配符alternatives.Policy.StartsWith(varFirst)和&s.Policy.EndsWith(varThird)
,对于不习惯正则表达式的人来说,这可能会更好一些。@Wiktor我还有一个不相等的regex场景。