2

我有IDictionary<TKey, TValue>TKey堂课。我可以添加使用带有String值而不是 a的索引器的功能TKey吗?

public class MyClass {
  public string Name { get; set; }
}

....

//dict is a IDictionary<MyClass, object> 
dict.Add(new MyClass { Name = "Foo" });

目前我正在使用 Linq 来访问这些值,Name但我更喜欢这样的东西:

//This call returns the variable I added above
object value = dict["Foo"];

这可能吗?

4

2 回答 2

3

您可以根据您的班级创建自己的词典班级。

public class MyClass
{
    public string Name { get; set; }

    // You may want to implement equality members on your class so that 
    // the dictionary treats the Name value as the key correctly.
}

public class MyClassDictionary<TValue> : Dictionary<MyClass, TValue>
{
    public TValue this[string val]
    {
        get
        {
            return base[Keys.First(x => x.Name == val)];
        }
    }
}

然后,您可以随意使用它。

MyClassDictionary<string> instance = new MyClassDictionary<string>();

instance.Add(new MyClass() { Name = "testkey" }, "test value");

Debug.WriteLine(instance["testkey"]);
于 2013-02-12T00:05:53.107 回答
0

这可能是解决您的问题的好方法,如果使用Name定义相等性对于一般来说是有意义的MyClass,而不仅仅是在这个特定的字典中:

public class MyClass
{
    public string Name { get; set; }
    public override int GetHashCode()
    {
        return Name.GetHashCode();
    }
    public override bool Equals(object other)
    {
        return this.Name == ((MyClass)other).Name;
    }
}

然后你的字典只是由MyClass对象索引。如果您有显式string而不是MyClass实例,则可以像这样获取字典的值:

dict[new MyClass { Name = "Foo" }]

您还可以添加:

public static implicit operator MyClass(string s)
{
    return new MyClass { Name = s };
}

和索引如:

dict["Foo"]

同样,只有在一般情况下才这样做MyClass,而不仅仅是在这个特定的字典中使用。如果是针对这个特定的字典,请尝试其他解决方案。

于 2013-02-12T00:16:17.003 回答