而不是使用Dictionary<TKey,TValue>
我想要一些類型的集合類,可以使用值的屬性作爲關鍵,是否有這樣的事情?是否有像集合這樣的字典可以使用它的值的屬性作爲關鍵?
回答
是的,有 - System.Collections.ObjectModel.KeyedCollection<TKey, TValue>
。
這是抽象的,並且在我看到的框架中沒有具體的派生類,但是我所看到的所有需要實現的都是GetKeyForItem
。例如,你可以這樣做與代表:
public class DelegatingKeyedCollection<TKey, TItem> : System.Collections.ObjectModel.KeyedCollection<TKey, TItem>
{
private readonly Func<TItem, TKey> keySelector;
public DelegatingKeyedCollection(Func<TItem, TKey> keySelector)
{
this.keySelector = keySelector;
}
protected override TKey GetKeyForItem(TItem item)
{
return keySelector(item);
}
}
使用正常的,當你設置的鍵值對,指定您感興趣的價值的財產。
那是太容易了,我一定是誤解你的要求。
也許你想使用任意屬性,而不是在輸入時。在這種情況下,我認爲你將不得不使用多個字典對象(可能綁定在一個助手類中)。
KeyedCollection作爲Jon Skeet說是明顯的候選人。
一些關於這個類隨機備註:
你當然會希望您使用的關鍵是隻讀屬性。
其方法
Contains(TItem item)
從Collection<T>
繼承,並通過迭代通過集合實現。因此這可能比Contains(TKey key)
慢得多。這太容易爲開發者採用了錯誤的過載的錯誤,因此它可能是值得考慮實現自己的Contains(TItem item)
方法:public new bool Contains(TItem item) { if (item == null) throw new ArgumentNullException("item"); return this.Contains(GetKeyForItem(item)); }
不像一個IDictionary,它沒有一種方法
TryGetValue
。這可能是有用的,它可能是值得實現自己:public bool TryGetValue(TKey key, out TItem item) { // If the dictionary exists, use it if (Dictionary != null) return Dictionary.TryGetValue(key, out item); // Else do it the hard way if (!this.Contains(key)) { item = default(TItem); return false; } item = this[key]; return true; }
它不支持鍵枚舉,這可能是有用的:
public IEnumerable<TKey> GetKeys() { foreach (TItem item in this) { yield return GetKeyForItem(item); } }
序列化可能是低效的,因爲它會序列化它的內部列表和它的內部字典。如果需要通過實現自定義序列化,您可以瞭解這一點。
+1,這就是鍵控收集應該如何實施。兩個建議,我會稱之爲'TryGetItem'並使'GetKeys'成爲'Keys'的屬性。 – nawfal 2013-11-01 02:32:38
- 1. 集合是否像沒有值的字典一樣工作?
- 2. 是否可以使用HashSet作爲HashMap的關鍵字?
- 3. 可以自動實現的屬性是否有私有集合?
- 4. Ansible 2:是否可以使用變量作爲字典鍵
- 5. 是否可以在Swift中使用Type作爲字典鍵?
- 6. 字典作爲關鍵值?
- 7. 這是可以使用像所有關鍵字
- 8. 有沒有一個集合像一個沒有值的字典一樣工作?
- 9. 是否可以使用lambda作爲字典默認值?
- 10. C++中是否有「屬性」關鍵字?
- 11. 我可以使用一個值作爲另一個字典的關鍵嗎?
- 12. 如何實現我自己的集合,可以像字典一樣使用
- 13. 是否有可能像使用字典一樣使用Enum值對
- 14. 像Redis這樣的關鍵/值數據存儲是否適合授權數據?
- 15. 是否可以在ant中指定屬性值作爲屬性?
- 16. 檢查字典是否有相同的值的關鍵
- 17. 使用字典作爲其他字典中的關鍵字
- 18. 是否可以添加圖像(png)作爲Java類的屬性?
- 19. 作爲屬性的'this'關鍵字
- 20. 使用對象屬性作爲字典中的鍵
- 21. .NET中是否有一個集合可以同時用作字典和列表?
- 22. c#字典鍵開頭的數字值是否可以提高查找性能?
- 23. 根據extjs4,是否有像'flex'這樣的垂直屬性?
- 24. 我可以將字典作爲具有默認返回值的屬性嗎?
- 25. 確定元素的集合是否可以使用像$(「。someClass」)這樣的JQuery可見
- 26. 使用對象的屬性作爲字典的關鍵字從對象數組創建字典?
- 27. 可以使用'this'關鍵字計算其屬性的對象
- 28. 是否有可能在Haskell中創建像Scala 2.8這樣的集合api?
- 29. ant:是否可以使用glob模式作爲屬性的位置屬性?
- 30. 是否可以使用Yield關鍵字來返回沒有循環的值?
如果在添加對象後設置對象的屬性,則該對象的屬性將與集合中的鍵不同步。 – Jeremy 2009-11-21 00:37:38