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

Posted

技术标签:

【中文标题】不等于 3 个变量的串联的 Linq 条件【英文标题】:Linq condition with NOT equal for concatenation of 3 variables 【发布时间】:2020-12-27 05:04:29 【问题描述】:

我确实有一个非常有用的 SO 问题,我需要一个通配符解决方案。但是,我还需要一个“不等于”。

例子:

varFirst = "ABC"
varSecond = "DEF"
varThird = "GHI"

通常,没有“不等于”:

var x = vidaBiliy.SponsorPackage.Where(s => s.Policy == varFirst + varSecond + varThird ).FirstOrDefault();

所以,有人帮助我的是通配符,其中说varSecond 可以是任何东西

.Where(s => Regex.IsMatch(s.Policy, $"^Regex.Escape(varFirst).*Regex.Escape(varThird)$"))

这似乎是正确的,第一个和最后一个变量完全匹配,中间变量的任何内容都与.* 匹配。

但是,对于 Regex,我该如何处理 varSecond 不能等于 DEF

【问题讨论】:

杰里米,我想你只需要解释你想要做什么。我目前还不清楚,抱歉……你的目标是什么? 看看我列出的另一个问题。 var x = vidaBiliy.SponsorPackage.Where(s => s.Policy == varFirst + varSecond + varThird ).FirstOrDefault(); ,所以说 varSecond = "DEF" ,好吧,我想让它的正则表达式不等于 DEF ,因此我最终会得到 3 个组合,其中包含 3 个不同查询的 first 、 second 和 third 变量。 请不要将您的问题写成其他问题的延续!这很难为您提供帮助 - 请将您的问题更新为 独立问题,并附上所有相关详细信息。谢谢! @CoolBots 好的,我明白了。我删除了其他通配符其他问题并对其进行了修改。看一看 。再次感谢 您可以在其中添加一个负前瞻 $"^Regex.Escape(varFirst)(?!Regex.Escape(varSecond)).*Regex.Escape(varThird)$" 请注意,在您的 ABC、DEF、GHI 示例中,它将匹配“ABCXDEFGHI”,因为“XDEF”不是“DEF”。 【参考方案1】:

你可以使用

$"^Regex.Escape(varFirst)(?!Regex.Escape(varSecond)Regex.Escape(varThird)$).*Regex.Escape(varThird)$"

这意味着,varFirstvarThird 之间的匹配将失败,只有 varSecond 模式。表达式看起来像

^ABC(?!DEFGHI$).*GHI$

请参阅regex demo。

详情

^ - 字符串开头 ABC - varFirst 模式 (?!DEFGHI$) - 没有 varSecond + varThird 模式后跟字符串结尾 .* - 除换行符以外的任何 0+ 个字符 GHI - varThird$ - 字符串结束。

【讨论】:

等等,你写了两次 varThird 部分? @JeremyMiller 当然,您需要为第二个变量文本设置右侧上下文才能锚定它。 好像是说先匹配,第二不相等,匹配第三然后通配符第三 该解决方案有效as expected。【参考方案2】:

像这样简单明了的东西怎么样:

设置:

private const string Starts = "ABC";
private const string NotMiddle = "DEF";
private const string Ends = "GHI";

private const string StartMiddleEnd = "ABCDEFGHI";
private const string StartCloseEnd = "ABCXDEFGHI";
private const string StartAnyEnd = "ABCANYGHI";
private const string StartAnything = "ABCANYTHING";
private const string AnythingEnd = "ANYTHINGGHI";

private static readonly List<string> Strings = new List<string>

    StartMiddleEnd,
    StartCloseEnd,
    StartAnyEnd,
    StartAnything,
    AnythingEnd,
;

然后运行:

public static void Test()

    int startMiddleEndLength = Starts.Length + NotMiddle.Length + Ends.Length;
    var results = Strings.Where(
        s => s.StartsWith(Starts)
             && s.EndsWith(Ends)
             && (s.Length != startMiddleEndLength ||
                 s.Substring(Starts.Length, NotMiddle.Length) != NotMiddle));
    foreach (var result in results)
    
        Debug.WriteLine(result);
    

由此产生的输出是:

ABCXDEFGHI
ABCANYGHI

【讨论】:

我怎么能改变这个所以不是中间不是,而是第一个和最后一个?我需要能够检查 3 个场景中的每一个的组合,其中 NotFirst ,任何第二个,任何第三个,然后是你拥有的一个,最后是任何第一个,任何第二个不是第三个 first 和 last 的代码非常简单。很容易适应您想要的任何规则集(包括您在运行时加载的规则集)。中间比较复杂,但如果经过深思熟虑,可以建立规则。如果你想要这样的东西,写一个非常明确的问题,使用这里的一些代码。但要明确一点,包括每个场景的示例。好像站着一样,我相信我已经回答了你提出的问题 是的,我需要回答一个新问题。所以我决定使用 Linqpad 并为 Not Start、Not Middle、Not End 创建所有其他类型的条件......然后是 Any Start、Any Middle、Any End 的通配符——然后我尝试将其插入我的 REAL SQL代码和繁荣,抱怨不知道 StartsWith 和 SubString 是什么......我很困惑,因为我花了很多时间,但它就像我没有使用 Linq to SQL 或其他东西。在我写一个问题之前的想法?谢谢 您在问题中没有提到您的 LINQ 代码与数据库通信。当您使用 LINQ to SQL 或实体框架时,您的 LINQ 代码必须可转换为 SQL 代码。如果您正在与 Entity Framework 交谈,您可能希望查看类似 Microsoft.EntityFrameworkCore.DbFunctions.Like 的内容

以上是关于不等于 3 个变量的串联的 Linq 条件的主要内容,如果未能解决你的问题,请参考以下文章

linq 连接中是不是存在“不等于”

算法训练营:等式

oracle储存过程中,if条件为某变量不等于1,怎么写

在 T-SQL CASE 语句的 WHEN 条件中设置变量等于数字时语法不正确[关闭]

c# Linq 方法不符合我设置的条件之一

设置变量等于 if 语句条件