在Value类中保存字典键

时间:2015-11-19 12:07:00

标签: c# dictionary

想象一下如下代码:

Dictionary<string, MyClass> dictionary = new Dictionary<string, MyClass>() {
    { "Name 1", new MyClass("Name 1", "Second Value 1") },
    { "Name 2", new MyClass("Name 2", "Second Value 2") },
    { "Name 3", new MyClass("Name 3", "Second Value 3") }
}

我需要MyClass将密钥(例如“名称1”)存储为字段。我也喜欢Dictionary对我正在做的事情的灵活性(利用密钥访问项目)。

我无法找到一种方法来实现我想要的,而无需像上面的代码那样指定键两次。

关于如何解决这个问题的任何想法?

3 个答案:

答案 0 :(得分:2)

您可以在数组中创建所有MyClass个实例,然后使用LINQ将所述数组转换为字典:

Dictionary<string, MyClass> dictionary = new MyClass[]
{
    new MyClass("Name 1", "Second Value 1"),
    new MyClass("Name 2", "Second Value 2"),
    new MyClass("Name 3", "Second Value 3")
}.ToDictionary(c => c.NameProperty, c => c);

请注意NameProperty应该是包含字典键的属性(包含这些"Name X"值的键)

答案 1 :(得分:1)

你想要的实际上是对象及其名称之间的双向映射,因此在引擎盖下,密钥必须存储两次(在两个映射方向上),但你可以隐藏行为:

1)扩展方法

public static void Add(this Dictionary<string, MyClass> dictionary, Myclass obj){
    dictionary.Add(obj.name, obj);
}

2)或者从Dictionary中派生一个类并编写新函数来添加和修改存储对象(如上面的扩展方法)。

class A : Dictionary<String, MyClass>
{
    public void Add(MyClass m)
    {
        this.Add(m.Name,m);
    }
}

*这种情况它也会起作用,这是你真正想要的,我想:

A a = new A() {new MyClass("name", "second value") };

3)将myClass的隐式转换运算符写入KeyValuePair,反之亦然。在这种情况下,您可以将KeyCaluePairs等MyClass实例与您的字典一起使用(初始化列表除外!)。

class MyClass
{

// ...other members 

public static implicit operator KeyValuePair<string,MyClass>(MyClass obj)
{
    return new KeyValuePair<string,MyClass>(obj.Name,obj);
}

public static implicit operator MyClass(KeyValuePair<string,MyClass> kvp)
{
    return kvp.Value;
}

}

随意使用并结合上述方法。

答案 2 :(得分:0)

另一种使用ToDictionary的LINQ-esque解决方案(避免使用字段):

var dictionary = new[] { "Name 1", "Name 2", "Name 3" }
    .ToDictionary(k => k, v => new MyClass(v, "Second Value"));

但鉴于您对&#34; Second Value&#34;

的要求,这可能不合适

修改

如果您有第二个参数的命名条件,则为替代解决方案:

var dictionary = Enumerable.Range(1, 3)
    .ToDictionary(k => "Name " + k, v => new MyClass("Name " + v, "Second Value " + v));