从KeyedCollection中获取键列表的最有效方法是什么?

3

我正在寻找一种与泛型字典的Keys属性(类型为KeyCollection)一样高效的方法。

使用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());
            }
        }
    }

虽然与您的问题无关,但通常情况下,KeyedCollections可能会更有效率。请参见此相关链接:https://dev59.com/-UvSa4cB1Zd3GeqPf51A - nawfal
2个回答

5
根据文档,该类有一个属性Dictionary,因此您可以这样做:
var keys = collection.Dictionary.Keys;

请注意,根据文档描述,存在一个警告。如果您使用字典的阈值值构建集合,则字典将不会被填充,直到至少放入该集合中的那么多个值。
如果这不适用于您的情况,即字典始终可用,则上述代码应该可以解决问题。
如果不是这样,那么您必须更改构造方式以避免设置该阈值,或者只需循环并通过GetKeyForItem方法提取键。

2

我不确定这是最有效的方法,但您可以使用Dictionary属性来检索通用字典表示,然后在该属性上使用Keys属性来获取键列表。


1
读取该属性是一个O(1)操作。 - Lasse V. Karlsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接