从KeyedCollection中获取键列表的最有效方法是什么?
本文关键字:有效 方法 是什么 列表 KeyedCollection 获取 | 更新日期: 2023-09-27 18:02:41
我正在寻找一种与通用字典的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();
}
}
}
Update:感谢您的回答,因此我将使用以下属性而不是迭代Linq。
public ICollection<TKey> Keys {
get {
if (this.Dictionary != null) {
return this.Dictionary.Keys;
}
else {
return new Collection<TKey>(this.Select(this.GetKeyForItem).ToArray());
}
}
}
根据文档,类有一个属性Dictionary,所以您可以这样做:
var keys = collection.Dictionary.Keys;
请注意,这里有一个警告,如文档中所述。如果使用字典的阈值构造集合,则至少在将那么多值放入集合之前不会填充字典。
如果这不是您的情况,即。字典总是很好用的,上面的代码应该可以解决这个问题。
如果没有,那么您要么必须更改构造以避免设置该阈值,要么必须通过GetKeyForItem方法循环并提取键。
不确定这是最有效的,但是您可以使用Dictionary属性来检索通用字典表示,然后使用其上的Keys属性来获取键列表。