不等于 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)$"
这意味着,varFirst
和 varThird
之间的匹配将失败,只有 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 条件的主要内容,如果未能解决你的问题,请参考以下文章