Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq通配符,而不是Linq语句所需的条件_C#_.net_Regex_Linq - Fatal编程技术网

C# Linq通配符,而不是Linq语句所需的条件

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

我在为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(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,我想我的上一次更新
时所有的
都应该与你最后的评论输出相匹配。请检查。第一个和第三个应该是匹配的,第二个是通配符alternative
s.Policy.StartsWith(varFirst)和&s.Policy.EndsWith(varThird)
,对于不习惯正则表达式的人来说,这可能会更好一些。@Wiktor我还有一个不相等的regex场景。