2017-02-20 15 views
1

良い一日、比較は行く障害のあるC#の辞書<文字列、文字列[]>すべての

私は、Dictionary<String, String[])>を持っているようなキー=>値の例では、次の:

{ "Eten/drinken", new string[] { "canteen", "mcdonald's", "mimi" } } 

私は比較する必要があります

if (categories.Any(x => x.Value.Contains(part))) { 
     category = categories.FirstOrDefault(x => x.Value.Contains(part)).Key; 
} 

一のシナリオpart = "mcdonald's veghel veghel"、辞書値との比較に戻ってくることができる:辞書の値のいずれかの文字列partfalse

なぜ偽ですか? "mcdonald's veghel veghel"にはmcdonald'sが含まれており、ゼロスペース比較が必要な方法で行われます。

+1

それらのどれもが、 '"マクドナルドが含まれていないので:与えられた値はx.Valueのアイテム/ sのが含まれているので、あなたは次のようにクエリを変更する必要があり、一方、残念ながら何のx.Valueは、与えられた文字列が含まれていることはありませんveghel veghel "'部分文字列です。 – zerkms

+1

*なぜそれが間違っているのですか? - まあ、あなたは ''マクドナルドのveghel veghel ''を '{" canteen "、" mcdonald's "、" mimi "}'と比較しました。値に 'part'変数の単語が含まれているかどうかを比較するには、' 'mcdonald's veghel veghel ''を '{" mcdonald's、 "veghel"} 'に分割してから、それらは辞書の配列に存在します。 –

+0

面白いことに、これは実際に私のコードで前にしたことですが、あまりにも邪悪であると思っていました。私のことを明確にしてくれてありがとう! – MwBakker

答えて

2

:あなたは、長い文字列partはあなたのリストからいずれかのキーワードが含まれている、すなわち条件の逆を、望んでいました。

var collectionResult = categories.FirstOrDefault(x => x.Value.Any(s=> part.Contains(s))); 
if(collectionResult != null) 
{ 
    var selectedKey = collectionResult.Key; 
} 
+1

良いアイデアをありがとう、それはこの方法ではなく、分割することができます。 –

+0

この提案をありがとう、この返信の迅速さのために! – MwBakker

+1

@MwBakker:言及はありません、私たちはすべてここにいます。ハッピーバディ –

3

ラムダ内の式x.Value.Contains(part)は、{"canteen", "mcdonald's", "mimi"}の要素のいずれかが"mcdonald's veghel veghel"という文字列(false)を含むことを意味します。実際String.Containsメソッドは、指定された文字列中に存在する任意の指定subsringをチェックします

categories.Any(x => x.Value.Any(s => part.Contains(s))) 
+0

@zerkmsあなたは正しいです、別の 'Any'が必要です。 – dasblinkenlight

+0

ありがとうございました!クイックレスポンスと素晴らしい提案 – MwBakker

+1

それでも、存在のみをチェックします。実際には、オペレーションは '.Key'をアイテムに対応させています。私はそれを完璧にするためにいくつかの編集をしなければならないと思います。 –

関連する問題