在自定义类上创建字典样式集合初始值设定项

Chr*_*eet 19 c# dictionary

可能重复:
自定义集合初始化程序

我有一个简单的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; }
    }
Run Code Online (Sandbox Code Playgroud)

并且希望能够像Dictionary对象一样定义它,所有内联都像这样:

var temp = new Pair<int, string>[]
        {
            {0, "bob"},
            {1, "phil"},
            {0, "nick"}
        };
Run Code Online (Sandbox Code Playgroud)

但它要求我定义一个全新的Pair(0,"bob")等,我将如何实现它?

像往常一样,谢谢你!

Yur*_*ich 21

要使自定义初始化像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();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你就可以做到

var temp = new PairList<int, string>
{
    {0, "bob"},
    {1, "phil"},
    {0, "nick"}
};
Run Code Online (Sandbox Code Playgroud)


ken*_*n2k 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();
}
Run Code Online (Sandbox Code Playgroud)

你也可以创建你自己的集合(我怀疑是这种情况,因为你有Value1两个项目是相同的,所以T1不作为你的例子中的一个键)不继承Dictionary.

如果你想使用集合初始化器的语法糖,你就必须提供Add这需要两个参数的方法(T1T2它们intstring你的情况).

public void Add(int value1, string value2)
{
}
Run Code Online (Sandbox Code Playgroud)

请参阅自定义集合初始化器


Chr*_*ris 5

public class Paircollection<T1, T2> : List<Pair<T1, T2>>
{
    public void Add(T1 value1, T2 value2)
    {
        Add(new Pair<T1, T2>(value1, value2));
    }
}
Run Code Online (Sandbox Code Playgroud)

然后

var temp = new Paircollection<int, string>
{
    {0, "bob"},
    {1, "phil"},
    {0, "nick"}
};
Run Code Online (Sandbox Code Playgroud)

将工作。本质上,您只是在创建一个List<Pair<T1,T2>>知道如何正确执行添加操作的版本。

显然,它可以扩展到除Pair之外的任何其他类(以字典解决方案无法实现的方式)。

感谢Yuriy Faktorovich为我提供的初步理解以及为我指明正确方向的相关问题向我提供了帮助。