LINQ 语句需要 Linq 通配符和 NOT 条件
Posted
技术标签:
【中文标题】LINQ 语句需要 Linq 通配符和 NOT 条件【英文标题】:Linq wildcard and NOT condition needed for LINQ statement 【发布时间】:2020-12-23 23:34:33 【问题描述】:我正在寻找一些用于 LINQ 的通配符 - 但运气不佳
本质上存在一个 for 循环,这些变量会在其中发生变化
varFirst = "ABC"
varSecond = "DEF"
varThird = "GHI"
所以对于我的通配符搜索,我想确保 varFirst 和 varThird 匹配,但 varSecond 是通配符,可以是任何东西。
我正在查看正则表达式,但我无法理解如何执行此操作。
var x = vidaBiliy.SponsorPackage.Where(s => s.Policy == varFirst + varSecond + varThird ).FirstOrDefault()
所以在循环数据时,我在上面有一个查询,它连接了这 3 个变量(它们在此之前根据循环中的值发生变化。所以在这种情况下 - 我只希望 varFirst 和 varThird 完全匹配。 .. 但是 varSecond 可以是任何东西。我想规范使用 *** ,但这只是意味着任何东西都是允许的
我正在查看 regEx.IsMatch(item) ,但后来我想知道如何实现这一目标。
然后我需要再次检查“搜索 NOT 条件”
是我想多了还是没有足够的信息?
【问题讨论】:
Where(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)varSecondRegex.Escape(varThird)") )
@Dalorzo 所以在你的,我会拆分 varSecond ,但 s.Policy 在 linq where 子句之外不存在,并且约束意味着精确?
【参考方案1】:
如果您只需要保留Policy
属性以varFirst
开头并以varThird
结尾的项目,您可以使用
.Where(s => Regex.IsMatch(s.Policy, $"^Regex.Escape(varFirst).*Regex.Escape(varThird)$"))
这将创建一个类似^ABC.*DEF$
的正则表达式,并将匹配任何以ABC
开头并以DEF
结尾的字符串,其中包含除换行符之外的任何0 个或多个字符。
如果您需要部分匹配,请移除锚点 ^
和 $
。
如果 varFirst
和 varThird
可以包含特殊的正则表达式元字符,例如必须按字面匹配的 (
或 [
,则需要 Regex.Escape
方法。
【讨论】:
或者s.Policy.StartsWith(varFirst) && s.Policy.EndsWith(varThird)
,对于不习惯正则表达式的人来说可能读起来更好。
@Wiktor 我有另一个 Not equal regex 场景。 ***.com/questions/63800208/…【参考方案2】:
首先,让我们创建一个方便的方法来接受您的强制参数:
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
,但可以将它们组合成一种方法。
【讨论】:
当它循环查询时,它正在寻找组合匹配,其中通配符暗示中间无关紧要。因此,如果在循环中 varFirst = ABC , varSecond = DEF 和 varThird = GHI ,那么如果 s.Policy = ABC123GHI ,那么它通过 ok 并且中间 (varSecond) 可以是任何东西。 我不知道 IsIn 和 IsAny 的区别... 所以 varFirst 和 varThird 必须是完全匹配的,但 varSecond 可以是任何东西 - 所以我担心最后一个查询是哪一个 @JeremyMiller,我认为我的最后一次更新WhenAll
应该与你最后的评论输出相匹配。请检查。
First 和 Third 应该有 IsMatch ,第二个是通配符以上是关于LINQ 语句需要 Linq 通配符和 NOT 条件的主要内容,如果未能解决你的问题,请参考以下文章