我有一个简单的Pair类:
public class Pair<T1, T2>
{
public Pair(T1 value1, T2 value2)
{
Value1 = value1;
Value2 = value2;
}
public T1 Value1 { get; set; }
public T2 Value2 { get; set; }
}
并且希望能够像Dictionary对象一样定义它,所有内联都像这样:
var temp = new Pair<int, string>[]
{
{0, "bob"},
{1, "phil"},
{0, "nick"}
};
但它要求我定义一个全新的Pair(0,“bob”)等,我该如何实现呢?
像往常一样,谢谢你们!
答案 0 :(得分:20)
要使自定义初始化像Dictionary一样工作,您需要支持两件事。您的类型需要实施IEnumerable
并拥有适当的Add
方法。您正在初始化Array
,其中没有Add
方法。例如
class PairList<T1, T2> : IEnumerable
{
private List<Pair<T1, T2>> _list = new List<Pair<T1, T2>>();
public void Add(T1 arg1, T2 arg2)
{
_list.Add(new Pair<T1, T2>(arg1, arg2));
}
IEnumerator IEnumerable.GetEnumerator()
{
return _list.GetEnumerator();
}
}
然后你可以做
var temp = new PairList<int, string>
{
{0, "bob"},
{1, "phil"},
{0, "nick"}
};
答案 1 :(得分:7)
为什么不使用继承自Dictionary
?
public class PairDictionary : Dictionary<int, string>
{
}
private static void Main(string[] args)
{
var temp = new PairDictionary
{
{0, "bob"},
{1, "phil"},
{2, "nick"}
};
Console.ReadKey();
}
您也可以创建自己的集合(我怀疑是这种情况,因为您对两个项目具有相同的Value1
,因此T1
不会在您的示例中充当关键字)不是从Dictionary
继承。
如果要使用集合初始化程序的语法糖,则必须提供一个Add
方法,该方法需要2个参数(T1
和T2
int
在你的情况下string
。
public void Add(int value1, string value2)
{
}
答案 2 :(得分:5)
public class Paircollection<T1, T2> : List<Pair<T1, T2>>
{
public void Add(T1 value1, T2 value2)
{
Add(new Pair<T1, T2>(value1, value2));
}
}
然后
var temp = new Paircollection<int, string>
{
{0, "bob"},
{1, "phil"},
{0, "nick"}
};
会奏效。基本上你只是创建一个List<Pair<T1,T2>>
的版本,知道如何正确添加东西。
这显然可以扩展到除了Pair之外的任何其他类(以字典解决方案不是这样的方式)。
感谢Yuriy Faktorovich帮助我完成了我最初的理解和相关的问题,指出了我正确的方向。
答案 3 :(得分:0)
您正在寻找的语法不是由与字典一起使用的对象提供的,而是字典集合本身。如果您需要能够使用集合初始化程序,那么您将需要使用现有集合(如Dictionary)或实现自定义集合来容纳它。
否则你基本上只限于:
var temp = new Pair<int, string>[]
{
new Pair(0, "bob"),
new Pair(1, "phil"),
new Pair(0, "nick")
};