我一直在使用键入自定义类的字典,然后将它们键入外部值。为了更好的封装,我想使用类的一个属性作为键值。有没有一种简单的方法可以在不创建字典的自定义实现的情况下执行此操作?
示例:
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>();
答案 0 :(得分:4)
我认为您正在寻找KeyedCollection<TKey, TItem>
与字典不同,
KeyedCollection<TKey, TItem>
的元素不是键/值对;相反,整个元素是值,键嵌入在值中。例如,从KeyedCollection<String,String>
(在Visual Basic中为KeyedCollection(Of String, String)
)派生的集合的元素可能是&#34; John Doe Jr。&#34;其价值是&#34; John Doe Jr。&#34;关键是&#34; Doe&#34 ;;或者可以从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);