假设我有一本字典 Dictionary<string,sting>.
我想看看这个字典的字符串值是否包含一些字符串模式,比方说“abc”,同时不包含模式“def”和“ghi”。另外,我希望此检查不区分大小写。
我可以这样写:
var options = new Dictionary<string,string>();
...
if (!options.Any(kvp1 => (kvp1.Value.Contains("def", StringComparison.InvariantCultureIgnoreCase))
&& !options.Any(kvp2 => kvp2.Value.Contains("ghi", StringComparison.InvariantCultureIgnoreCase))
&& options.Any(kvp3 => kvp3.Value.Contains("abc", StringComparison.InvariantCultureIgnoreCase)) ))
{
Do Something...
}
所以我想知道,有没有更优雅的方式来执行这样的操作?
UPD:这段代码确实有一个错误。我想要的是检查值列表是否至少有一个包含“abc”的元素,并且根本没有包含“def”和“ghi”的元素。所以稍微编辑了一下代码。
最佳答案
有很多事情需要处理。基于文化的不区分大小写的比较和动态的非硬编码模式,例如:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Globalization;
namespace ConsoleApplication7
{
internal static class Program
{
internal static void Main(string[] args)
{
var options = new Dictionary<string, string>();
var compareCulture = CultureInfo.CurrentCulture;
var patternsNeeded = new[] { "abc", "def" };
var patternsForbidden = new[] { "ghi", "xxx" };
Func<KeyValuePair<string, string>, bool> meetsCriteria =
kvp => patternsNeeded.Any(p => compareCulture.CompareInfo.IndexOf(kvp.Value, p, CompareOptions.IgnoreCase) >= 0)
&& !patternsForbidden.Any(p => compareCulture.CompareInfo.IndexOf(kvp.Value, p, CompareOptions.IgnoreCase) >= 0);
var dictionaryContainsHits = options.Any(meetsCriteria);
}
}
}
如果您的字典很大,您可能需要在各处加入 .AsParallel()
。由于这些都是读取操作,它应该可以正常工作。
不确定您是否需要 .Any()
或 .All()
用于肯定列表中的模式。选择适合您的用例的那个。
关于c# - 查看字典字符串值是否包含某种模式并且同时不包含 C# 中的其他模式的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37968306/