想象一下如下代码:
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
对我正在做的事情的灵活性(利用密钥访问项目)。
我无法找到一种方法来实现我想要的,而无需像上面的代码那样指定键两次。
关于如何解决这个问题的任何想法?
答案 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));