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 个或多个字符。

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

如果 varFirstvarThird 可以包含特殊的正则表达式元字符,例如必须按字面匹配的 ([,则需要 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);
    

如果您希望 varFirstvarThirdPolicy 完全匹配:

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

如果您希望 varFirstvarThirdPolicy 完全匹配:

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,但可以将它们组合成一种方法。

【讨论】:

当它循环查询时,它正在寻找组合匹配,其中通配符暗示中间无关紧要。因此,如果在循环中 varFirst = ABC , varSecond = DEF 和 varThird = GHI ,那么如果 s.Policy = ABC123GHI ,那么它通过 ok 并且中间 (varSecond) 可以是任何东西。 我不知道 IsIn 和 IsAny 的区别... 所以 varFirst 和 varThird 必须是完全匹配的,但 varSecond 可以是任何东西 - 所以我担心最后一个查询是哪一个 @JeremyMiller,我认为我的最后一次更新WhenAll 应该与你最后的评论输出相匹配。请检查。 First 和 Third 应该有 IsMatch ,第二个是通配符

以上是关于LINQ 语句需要 Linq 通配符和 NOT 条件的主要内容,如果未能解决你的问题,请参考以下文章

怎么查看linq产生的sql语句

LINQ 的通配符搜索

Linq通配符搜索mvc c#

LINQ语句中的.AsEnumerable() 和 .AsQueryable()的区别

不等于 3 个变量的串联的 Linq 条件

带有表连接、case 语句、计数、group by 子句的 Linq 查询