C#使用LINQ All方法判断集合字符串匹配结果异常问题求解
字符串集合匹配逻辑实现问题
需求说明
需要实现字符串集合匹配判断逻辑:校验待查找字符串列表与对应关键词数组是否匹配,当*关键词数组中的所有文本,都能在待查找列表的任意元素中找到对应匹配(即元素包含该关键词文本)*时,输出对应提示信息。
原有代码问题
原有实现的判断逻辑顺序写反,运行后仅第二个场景触发输出,第一、第三个符合匹配规则的场景未生效,原有错误判断逻辑核心代码如下:
// 错误逻辑示例 if (FirstArrayToLookup.All(x => FirstStringContains.All(y => x.Contains(y)))) Console.WriteLine("First Array to Lookup");
该逻辑的实际判定规则是:待查找列表中的每一个元素,都必须同时包含所有关键词,和需求完全不符:
- 第一个场景的待查找列表包含
"FirstArray1"、"FirstArray2"两个元素,分别只包含"Array1"、"Array2",没有任何一个元素同时包含两个关键词,因此判定为不匹配 - 第二个场景的待查找列表仅有一个元素
"SecondArray1",刚好包含唯一关键词"Array1",因此可以正常触发输出 - 第三个场景的待查找列表元素分别只包含一个对应序号的关键词,没有元素同时包含三个关键词,因此判定为不匹配
正确LINQ实现
将判断逻辑调整为:所有关键词,都至少能在待查找列表中找到一个包含该关键词的元素,即调换两层判断的顺序,内层匹配使用Any而非All,修正后完整代码如下:
public static void Main() { List<string> FirstArrayToLookup = new List<string>(); List<string> SecondArrayToLookup = new List<string>(); List<string> ThirdArrayToLookup = new List<string>(); FirstArrayToLookup.Add("FirstArray1"); FirstArrayToLookup.Add("FirstArray2"); SecondArrayToLookup.Add("SecondArray1"); ThirdArrayToLookup.Add("ThirdArray1"); ThirdArrayToLookup.Add("ThirdArray2"); ThirdArrayToLookup.Add("ThirdArray3"); string[] FirstStringContains = { "Array1", "Array2" }; string[] SecondStringContains = { "Array1" }; string[] ThirdStringContains = { "Array1", "Array2", "Array3" }; if (FirstStringContains.All(keyword => FirstArrayToLookup.Any(item => item.Contains(keyword)))) Console.WriteLine("First Array to Lookup"); if (SecondStringContains.All(keyword => SecondArrayToLookup.Any(item => item.Contains(keyword)))) Console.WriteLine("Second Array to Lookup"); if (ThirdStringContains.All(keyword => ThirdArrayToLookup.Any(item => item.Contains(keyword)))) Console.WriteLine("Third Array to Lookup"); }
运行上述代码将按预期输出三行结果:
First Array to Lookup Second Array to Lookup Third Array to Lookup
注:如果需要忽略大小写匹配,可以在
Contains方法中传入字符串比较规则,例如item.Contains(keyword, StringComparison.OrdinalIgnoreCase)
内容的提问来源于stack exchange,提问作者Reinhardt
相关产品推荐
相关产品推荐

