c# - 查看字典字符串值是否包含某种模式并且同时不包含 C# 中的其他模式的最佳方法是什么?

标签 c# string dictionary contains

假设我有一本字典 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/

相关文章:

c# - 如何创建一个获取未知数量值的方法?

时间:: Create windows scheduled task as a different user

python - 使用特定字典初始化从类构建的对象

c# - 面向对象的嵌套字典数据结构

c# - 为什么我的 linq 结果在调试器中显示十六进制值?

c# - 有什么方法可以检测用户控件外的鼠标点击吗?

java - 欧元符号 JNA 转换问题

java - 字符串 "--"是不允许的,java 项目

javascript - 字符串操作以查找字符串中的变量

vb.net - 不区分大小写的字典不起作用