我一直在处理键入到自定义类中的字典,然后将其从外部值中删除。为了更好地封装,我想使用该类的属性之一作为键值。有没有一种简单的方法,而无需创建字典的自定义实现?
例:
public class MyStuff{
public int num{get;set;}
public string val1{get;set;}
public string val2{get;set;}
}
var dic = new Dictionary<int, MyStuff>();
是否有一些与此类似的选项? --
var dic = new Dictionary<x=> x.num, MyStuff>();
最佳答案
我认为您正在寻找KeyedCollection<TKey, TItem>
与字典不同,KeyedCollection<TKey, TItem>
的元素不是键/值对。相反,整个元素是值,并且键嵌入在值中。例如,从KeyedCollection<String,String>
(在Visual Basic中为KeyedCollection(Of String, String)
)派生的集合的元素可能是“ John Doe Jr”。值是“ John Doe Jr.”。关键是“ Doe”;或者可以从KeyedCollection<int,Employee>
派生包含整数键的员工记录集合。抽象的GetKeyForItem
方法从元素中提取密钥。
您可以轻松地创建一个通过委托实现GetKeyForItem
的派生类:
public class ProjectedKeyCollection<TKey, TItem> : KeyedCollection<TKey, TItem>
{
private readonly Func<TItem, TKey> keySelector;
public ProjectedKeyCollection(Func<TItem, TKey> keySelector)
{
this.keySelector = keySelector;
}
protected override TKey GetKeyForItem(TItem item)
{
return keySelector(item);
}
}
然后:
var dictionary = new ProjectedKeyCollection<int, MyStuff>(x => x.num);