3

一般的な辞書の (KeyCollection 型の) Keys プロパティと同じくらい効率的な方法を探しています。

Linq select ステートメントを使用すると機能しますが、キーが要求されるたびにコレクション全体を反復処理しますが、キーは既に内部に保存されている可能性があります。

現在、私の GenericKeyedCollection クラスは次のようになっています。

public class GenericKeyedCollection<TKey, TItem> : KeyedCollection<TKey, TItem> {
    private Func<TItem, TKey> getKeyFunc;

    protected override TKey GetKeyForItem(TItem item) {
        return getKeyFunc(item);
    }

    public GenericKeyedCollection(Func<TItem, TKey> getKeyFunc) {
        this.getKeyFunc = getKeyFunc;
    }

    public List<TKey> Keys {
        get {
            return this.Select(i => this.GetKeyForItem(i)).ToList();
        }
    }
}

更新:あなたの回答のおかげで、Linq を反復処理する代わりに、次のプロパティを使用します。

    public ICollection<TKey> Keys {
        get {
            if (this.Dictionary != null) {
                return this.Dictionary.Keys;
            }
            else {
                return new Collection<TKey>(this.Select(this.GetKeyForItem).ToArray());
            }
        }
    }
4

2 に答える 2

5

documentationに従って、クラスにはDictionaryプロパティがあるため、次のことができます。

var keys = collection.Dictionary.Keys;

ドキュメントに記載されているように、警告があることに注意してください。ディクショナリのしきい値を使用してコレクションを構築する場合、少なくともその数の値がコレクションに入れられるまで、ディクショナリは取り込まれません。

これがあなたの状況に当てはまらない場合、つまり。辞書はいつでも使えるので、上記のコードでうまくいくはずです。

そうでない場合は、そのしきい値を設定しないように構造を変更するか、ループしてGetKeyForItem メソッドを使用してキーを抽出する必要があります。

于 2011-07-19T00:05:19.223 に答える
2

これが最も効率的かどうかはわかりませんが、Dictionary プロパティを使用して一般的な辞書表現を取得し、その Keys プロパティを使用してキーのリストを取得できます。

于 2011-07-19T00:05:02.070 に答える