代码之家  ›  专栏  ›  技术社区  ›  darthtrevino

在C中,有没有一种方法可以为新的数据类型编写自定义对象初始值设定项?

  •  7
  • darthtrevino  · 技术社区  · 15 年前

    在C中,有“标准”初始值设定项技术property1=“a”,property2=“b”,还有一些集合的特殊变体(列表和字典)。值1、值2和键1、值1、键2、值2键。

    我希望有一个树数据类型的递归对象初始值设定项,但我不知道是否有任何方法可以自定义该机制。我想要一个S型的。 项1项2项3项4项5项6_

    我是通过构造器来实现这一点的,但我想要一个更简洁的语法。

    3 回复  |  直到 15 年前
        1
  •  11
  •   ChaosPandion    15 年前

    如果您执行 集合 IEnumerable接口和具有名为Add的方法。顺便说一下,这都包含在ICollection接口中,这就是为什么我混淆了它。

    Test test = new Test() {
        new Test2() {
            new Test3() {
    
            }
        },
        new Test() {
            new Test2() {
                { new Test(), new Test2() },
                { new Test(), new Test2() },
                { new Test(), new Test2() }
            }
        }
    };
    
    public class Test : IEnumerable
    {
        public void Add(Test a){}
        public void Add(Test2 a){}
        public IEnumerator GetEnumerator(){}
    }
    
    public class Test2 : IEnumerable
    {
        public void Add(Test a, Test2 b){}
        public void Add(Test3 a){}
        public IEnumerator GetEnumerator(){}
    }
    
    public class Test3 : IEnumerable
    {
        public void Add(Test a) {}
        public void Add(Test2 a){}
        public IEnumerator GetEnumerator(){}
    }
    
        2
  •  4
  •   Thomas    15 年前

    使用A variadic 局部拉姆达 n 只需调用构造函数,您就可以得到最短的:

    n(item1, n(item2, item3, item4), n(item5, item6))
    

    更新:类似

    var n = (params Node[] nodes) => new Node(nodes);
    
        3
  •  1
  •   thatismatt    15 年前

    如果树的节点易于构造,即可以从其值初始化,则可以通过添加一个额外的方法使事物比chaospantion的答案更简洁:

    class Tree : IEnumerable
    {
        public string Value { get; set; }
    
        public void Add(Tree t) { ... }
    
        // Add this method
        public void Add(string s)
        {
            Add(new Tree { Value = s });
        }
    
        public IEnumerator GetEnumerator() { ... }
    }
    

    所以:

    { item1 { item2 item3 item4 } { item5 item6 } }
    

    变成:

    new Tree { "item1", new Tree { "item2", "item3", "item4" }, new Tree { "item5", "item6" } };