2012-03-12 4 views
0

私は文字列people(key)と文字列アドレス(value)の辞書を持っています。私は、辞書内のいずれかのキーにサブストリング 'anders'が含まれている場合、trueを返すif文を使用したいと思います。これを行う方法はありますか? dict.ContainsKey( "anders")を試しましたが、明示的に 'anders'という名前のキーがあればtrueを返します。鍵がアンダーソンかアンデルセンであっても真実に戻したい私はこれがかなり奇妙なケースであることを知っていますが、私は目的のためにそれが必要です。あなたは、コレクションを反復処理し、それぞれをチェックする必要がありますキーサブストリングを検索してdict内のキーの存在を返す

おかげ

答えて

1

「ワイルドカード辞書検索キーを検索します。このタイプの検索を行うには、辞書があなたに与えるO(定数)検索を失うことになります。

辞書のキーを繰り返して、必要な部分文字列を含むものを探す必要があります。これはO(n * X)反復であり、nはキーの数であり、Xはキーストリングの平均サイズです。

あり助ける気の利いたワンライナーです:

bool containsKey = myDictionary.Keys.Any(x => x.Contains("mySubString")); 

は、しかし、それは重い操作です。

6

。 LINQ Any方法は、これはかなり簡単になります:

dict.Keys.Any(k => k.Contains("anders")) 
0
var pair = dict.FirstOrDefault(kvp => kvp.Key.Contains("anders")); 
0
if(dict.Keys.Any(k=>k.Contains("anders"))) 
{ 
    //do stuff 
} 
0

あなたが辞書のキーを反復処理し、それが文字列が含まれている場合、それぞれを確認することができます。

bool found = false; 
foreach (string key in dict.Keys) 
{ 
    if (key.Contains("anders")) 
    { 
     found = true; 
     break; 
    } 
} 

またはLINQを使用しました:

bool found = dict.Keys.Any(key => key.Contains("anders")); 
2

誰もがすでに明白な(そして正しい)Anyメソッドを指摘していますが、サブタイトルの大文字小文字の区別も正しい場合にのみ、述語としてString.Containsを使用します。大文字と小文字を区別しない検索を行うには、簡単な正規表現を使用します。

dict.Keys.Any(x => Regex.IsMatch(x, "(?i)anders")); 

または(Case insensitive 'Contains(string)'のように)StringComparison引数でIndexOfメソッドを使用します。M.Babcock @

dict.Keys.Any(x => x.IndexOf("anders", StringComparison.InvariantCultureIgnoreCase) >= 0); 
+0

を私はすでに時に私の答えを更新しました私はあなたのコメントを見た: –

+0

文字列の比較は、反復よりも重要ではない、私の意見では、あなたが優れた点を確認します。 – Randolpho

関連する問題