2009-11-13 24 views
5

Dictionary<int, MyTableClass>のMyTableClassが継承する最初の値はどのようにしてField<F1, F2, F3>になりますか?私は、辞書の最初の値を返すプロパティまたはプロパティ/メソッドの組み合わせを好むでしょう。F1 = MyEnum.value辞書の「最初の」値を見つける方法は?

私がしたくないことは、foreachです。パフォーマンス面では、これは本当に好ましい方法ではありません。

+4

パフォーマンスの面では、LINQなどは、辞書キーを検索していないため、 'foreach'より高速ではありません。キーの参照のみが高速です。それ以外の場合は、リニアスキャンを実行する必要があります(または、別のキーの2番目の辞書を維持する必要があります。これは検索の対象となります)。 –

+0

@Pavel:うわー...私はほぼ2年間で多くのことを学びました。私は今私が知っていることを知っていればいいと思う。 – IAbstract

答えて

6

ここでドレスアップするにしても、本質的にはforeachDictionaryの値以上にする必要があります。 Dictionary<TKey,TValue>は、指定された値に対するフル・キーのO(1)アクセスに近い値を提供します。部分キーへの効率的なアクセスを提供するようには設計されていません。それを得るには、2番目のDictionaryインスタンスを適切なマッピングにしておく必要があります。

2

.First()拡張メソッドを使用できます。

+0

。最初()に何? Dictionary objのそのようなメソッドはありません。 –

+0

あなたの答えにコンテキストを追加できる場合に役立ちます –

+0

これは拡張メソッドなので、System.Linqをインポートすると表示されます。 – maxpower47

6

いくつかの基準に一致する値を見つけるための最短方法(具体的に何を望んでいるかわからない - 最初にF1は汎用タイプのパラメータで、==を使用して値と同じように比較します。 。...xのブール式となります

dictionary.Values.First(x => ...); 

:)これを行うことです。ただし、これは辞書キーを検索していないため、foreachより速くはありません。キーの参照のみが高速です。それ以外の場合は、リニアスキャンを実行する必要があります(または、別のキーの2番目の辞書を維持する必要があります。これは検索の対象となります)。

5

辞書は要素間の任意の特定の順序を維持しないので、あなたには、いくつかの順序を指定しない限り、最初のいずれかになります任意の要素が実際に存在しない[コメントからコピー]。

あなたは辞書は次のように見つけることが起こることを最初の項目を取得することができます:

MyTableClass one = dict.Where(pair => pair.Value.F1 == MyEnum.value).First(); 

これは意志のアイテムを通してだけループあなただけのリストとしての辞書を使用しているので、それは、一致するものが見つかるまで。パフォーマンスが必要な場合は、F1の値がキーである辞書を用意する必要があります。

+0

皆様お返事ありがとうございます。私はforeachが私が望んでいたことをする唯一の方法であると確信していましたが、誰かが私が考えなかったアイデアがあるかどうかを見たいと思っていました。:) – IAbstract

関連する問題