LINQ

2017-09-20 13 views
0

せずにC#の辞書内の文字列のキーの最初の発生を検索するためにどのように私はこのように辞書にデータを持っている:キーは文字列型がLINQ

Dictionary<string, cls_CTCs> dict = new Dictionary<string, cls_CTCs>(); 
dict.Add("9814|30500994",Obj); 
dict.Add("41377|30302099",Obj); 
dict.Add("65793|30500337",Obj); 
dict.Add("92894|30300795",Obj); 
dict.Add("92894|30300826",Obj); 
dict.Add("92894|30300827",Obj); 
dict.Add("92894|30300828",Obj); 
dict.Add("56936|30300894",Obj); 
dict.Add("56936|30300365",Obj); 
dict.Add("56936|30300485",Obj); 

ある場合は、値はクラスのオブジェクトです。私は、likeまたはstartswithパターンでこの辞書のすべてのキーで文字列が最初に出現するのを見つけたい。たとえば、 "92894"を検索すると、 "92894 | 30300795"というキーが返されます。 "56936"を検索すると、キー "56936 | 30300894"が返されます。

私はそれがLINQを使って簡単に行うことができますが、私はLINQを使用したくないことを知っています.LINQを許可しないC#CLRストアドプロシージャでこのコードを使用します。だから、私が望むものを達成するための拡張方法や他の方法がありますか?

+0

要件は何ですか?それは本当に速くする必要がありますか?または単に辞書のエントリをループしないのはなぜですか? – MarkusE

+0

あなたの最後の質問と同じ回答 - linqを使わないで部分的なキー検索をすることはできません - forループを使用して、それは遅くなります - しかし、あなたのsqlがこれをやっているように聞こえるようになります – BugFinder

+2

ディクショナリの 'AllKeys部分的なキーと一致するようにそれぞれ 'String.StartsWith'を実行してから、マッチを返します。しかし、それがあなたの仕事であれば、辞書はデータ構造の最良の選択ではありません。試してみてください。 LINQはここでのパフォーマンスの改善に役立ちません。 – dlatikay

答えて

3

Dictionary.Keysを使用すると、辞書のすべてのキーを返すことができます。

しかし、辞書内のキーの順序は定義されていないため、最初のキーを見つけることは意味を持ちません。一致するキーはランダムに返します。

// Returns a key which starts with prefix, or null if not found. 
public string FindKey<T>(Dictionary<string, T> dict, string prefix) 
{ 
    foreach (string key in dict.Keys) 
    { 
     if (key.StartsWith(prefix)) 
      return key; 
    } 

    return null; 
} 
+0

ありがとう、ちょうど私が欲しかったthats、感謝の仲間、歓声! –

+0

@HemantSisodiaこの回答では、キーが返される順序は定義されていません。これは、辞書にキーを追加するだけで動作するように見えます。ただし、キーの削除を開始すると、キーが必要な順序で返されなくなることがあります。 –

+0

@MatthewWatsonキーを取り除くことはできないので、それは私にとってうれしいことです。私はちょうどそのようなキーが最初に出たかっただけです。 –

0

残念ながら、辞書を完全に反復スキャンせずに達成する方法はありません。

理由は、Dictionary<TKey, TValue>の現在の実装が内部的にどのように機能するかです。すべてのキーは、ハッシュコードを使用して索引付けされます(Object.GetHashCodeメソッドを参照)。だから、オブジェクト全体としてのキーの迅速かつ効果的な検索があります。

一部のキーを部分一致(など)で検索する必要がある場合は、各キーを繰り返し比較/検索するだけで済みます。

辞書のKeysコレクションを使用するか、またはKeyValuePair<TKey, TValue>オブジェクトを使用している辞書自体を反復するだけです。

ただし、特定の順序はありません。だから、「最初の出来事」は難しいことではありません。

オブジェクトの順序が重要な場合はOrderedDictionaryを使用します。