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

时间:2012-03-05 16:30:58

标签: c# dictionary

  

可能重复:
  Custom Collection Initializers

我有一个简单的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”)等,我该如何实现呢?

像往常一样,谢谢你们!

4 个答案:

答案 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个参数(T1T2 int在你的情况下string

public void Add(int value1, string value2)
{
}

请参阅Custom Collection Initializers

答案 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")
    };