2011-01-24 16 views
11

辞書のキーを同様の機能で検索したい。私は辞書:同様の機能を持つキーストリングを検索する

はどこ'のような(キー「SQLで、クエリを記述することが可能である「D」ではありません「E」またはその4RT文字でキーが「A」またはその第三文字で始まる取りたいです')と(' d__ 'のようなキーではない) "私は辞書のこの機能を使いたいです。あなたが持っているアルゴリズムの提案はありますか?

ありがとうございます!

答えて

11

これは、テーブルスキャンのSQLと同等になりますが、あなたは、そのキーのパターンに一致するすべての値のためにあなたの辞書を検索するLINQやIEnumerable<T>拡張メソッドを使用することができます:

拡張メソッド:

var values = dictionary.Where(pv => 
      pv.Key.StartsWith("A") || 
      (pv.Key.Length >= 3 && pv.Key[2] == 'e') || 
      pv.Key.Length < 4 || 
      pv.Key[3] != 'd').Select(pv => pv.Value); 

LIN Q:

これらの述語の最後の部分は、「4番目の文字は「d」ではありません。私はそれが3文字(またはそれ以下)の長さの文字列がこれにマッチすることを意味するようにしました。文字列が少なくとも4文字で、4文字目が「d」でない場合は、変更が明白でなければなりません。

Dictionaryクラスのプライマリ(パフォーマンス)メリットは、ハッシュベースのキールックアップを使用していることに注意してください(平均と最善のケースではO(1)です)。このような線形探索を使うとO(n)なので、このようなものは通常、通常のキー検索よりも遅くなります。

+0

あなたは素晴らしいです!答えをありがとう! – softwaremonster

2

だけのLINQを使用します。

var query = myDict.Where(x => x.Key.IndexOf('a') > -1 && x.Key.IndexOf("d_") == -1); 
+0

。実際のLINQ式では 'select'ステートメントが必要ですが、実際に変換を行っていない限り、LINQ拡張メソッドを使用するコードでは必要ありません。さらに、これは彼の要求されたロジックと一致しませんが、実際のコンセプトを指摘しているので私はupvotedしました。 –

+0

@Adam - それを指摘してくれてありがとう。私のLinq-fuはまだ開発が必要です。 – Oded

10

あなたが辞書のキーのプロパティにアクセスして、あなたの鍵を評価するためにLINQクエリを使用することができます。

var dictionary = new Dictionary<string,string>(); 

dictionary.Keys.Where(key => key.Contains("a")).ToList(); 
+3

私はこれを投票しますが、実際に線形スキャンを実行して調整を適用することが重要であると思います。 –

2

あなたはLINQ

を使用することができますこのようなもの

myDic.Where(d=>d.Key.StartWith("a")).ToDictionary(d=>d.Key,d=>d.Value) 

それとも

myDic.Where(d=>d.Key.Contains("b")).ToDictionary(d=>d.Key,d=>d.Value) 

それとも

myDic.Where(d=>some other condition with d.Key).ToDictionary(d=>d.Key,d=>d.Value) 
1

は、ここで私が手早く少し延長です:

public static IList<string> KeysLikeAt(this Dictionary<string, object> dictionary, char letter, int index) 
{ 
    return dictionary.Where(k => k.Key.Length > index && k.Key[index] == letter) 
     .Select(k => k.Key).ToList(); 
} 

public static IList<string> KeysNotLikeAt(this Dictionary<string, object> dictionary, char letter, int index) 
{ 
    return dictionary.Where(k => k.Key.Length > index && k.Key[index] != letter) 
     .Select(k => k.Key).ToList(); 
} 

、あなたはそうのようにそれを使用することができます: `選択(X => x)`は何もしません

IList<string> keysStartingWithA = dictionary.KeysLikeAt('a', 0); 

IList<string> keysNotStartingWithD = dictionary.KeysNotLikeAt('d', 0); 
+0

'string'クラスでインデクサーを使うのではなく、実際に' IndexOf'を使って文字列内で検索するのはなぜですか(長さをチェックしながら)? –

+0

は長さチェックで更新されました – hunter

+0

これは大文字と小文字が区別されるので、それを追加するといいかもしれません.... – hunter

関連する問題