我一直在处理键入到自定义类中的字典,然后将其从外部值中删除。为了更好地封装,我想使用该类的属性之一作为键值。有没有一种简单的方法,而无需创建字典的自定义实现?

例:

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);

10-02 03:09