簡體   English   中英

查看字典字符串值是否包含某些模式並且同時在C#中不包含其他模式的最佳方法是什么?

[英]What is the best way to see if Dictionary string values contain some pattern and at the same time doesn't contain another in C#?

假設我有一個字典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”的元素。 因此,編輯了一下代碼。

嘗試這個

var options = new Dictionary<string, string>();
var includedValues = new[] { "abc", "dfg" };
var excludedValues = new[] { "hij", "klm" };

var cultureInf = CultureInfo.CurrentCulture;
var containsPredicate = new Func<string, string, bool>((s1, s2) => {
    return cultureInf.CompareInfo.IndexOf(s1, s2, CompareOptions.IgnoreCase)>=0;
}); 

if (
includedValues.All(v => options.Values.Any(kv =>containsPredicate(kv, v)))
&&
excludedValues.All(v => !options.Values.Any(kv =>containsPredicate(kv, v))))
{
    // do smthg
}

有很多事情要照顧。 基於文化的不區分大小寫的比較和動態的,非硬編碼的模式,例如:

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()作為肯定列表中的模式。 選擇適合您的用例的一種。

您可以通過字典對象上的Values屬性直接訪問值。

好了,您可以創建自己的linq來執行此方法:

public static class ExtendedLinq
{
    public static bool All<T>(this IEnumerable<T> source, params Func<T, bool>[] conditions)
    {
        foreach (var condition in conditions)
            if (!source.Any(condition))
                return false;

        return true;
    }
}

然后用法:

var options = new Dictionary<string, string>();
if (options.Values.All((t => t.Contains("abc")), (t => !t.Contains("def")), (t => !t.Contains("ghi"))))
{
    // Do something
}

希望它最終是您想要的。

順便說一句,其中包含不區分大小寫的內容不屬於框架的一部分,所以我沒有包括它,因為您已經擁有它。

舊的(誤解了這個問題):var options = new Dictionary(); if(options.Values.Any(t => t.Contains(“ abc”)&&!t.Contains(“ def”)&&!t.Contains(“ ghi”))){//做某事}

它取決於上下文,因為查看Sorted字典Regex類可能很有用。

我建議你這樣做:

 var dictionaryVal = d.Select(p => p.Value.ToLower());
 string string1 = "string1";
 string string2 = "string2";
 string string3 = "string3";

 if (dictionaryVal.Contains(string1.ToLower())&&dictionaryVal.Contains(string2.ToLower())&&dictionaryVal.Contains(string3.ToLower()))
 {
     //your code here
 }

那就是看看字典的值是否包含string1但不包含string2和string3。但是...
如果您要檢查單個詞典項,並針對同一項的值檢查所有3個字符串,則為:

if (d.Any(p => p.Value.Contains(string1.ToLower()) && !p.Value.Contains(string2.ToLower()) && !p.Value.Contains(string3.ToLower())))
{
  // your code here
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM