[英]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”))){//做某事}
我建議你這樣做:
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.