当前位置:  开发笔记 > 编程语言 > 正文

递归泛型类型

如何解决《递归泛型类型》经验,为你挑选了2个好方法。

是否可以在C#中定义引用自身的泛型类型?

例如,我想定义一个Dictionary <>,它将其类型保存为TValue(用于层次结构).

Dictionary>>

Daniel Earwi.. 52

尝试:

class StringToDictionary : Dictionary { }

然后你可以写:

var stuff = new StringToDictionary
        {
            { "Fruit", new StringToDictionary
                {
                    { "Apple", null },
                    { "Banana", null },
                    { "Lemon", new StringToDictionary { { "Sharp", null } } }
                }
            },
        };

递归的一般原则:找到一些给递归模式命名的方法,因此它可以通过名称引用自身.



1> Daniel Earwi..:

尝试:

class StringToDictionary : Dictionary { }

然后你可以写:

var stuff = new StringToDictionary
        {
            { "Fruit", new StringToDictionary
                {
                    { "Apple", null },
                    { "Banana", null },
                    { "Lemon", new StringToDictionary { { "Sharp", null } } }
                }
            },
        };

递归的一般原则:找到一些给递归模式命名的方法,因此它可以通过名称引用自身.


lambda演算为胜利!

2> ja72..:

另一个例子是通用树

public class Tree where T : Tree
{
    public T Parent { get; private set; }
    public List Children { get; private set; }
    public Tree(T parent)
    {
        this.Parent = parent;
        this.Children = new List();
        if(parent!=null) { parent.Children.Add(this); }
    }
    public bool IsRoot { get { return Parent == null; } }
    public bool IsLeaf { get { return Children.Count==0; } }
}

现在用它

public class CoordSys : Tree
{
    CoordSys() : base(null) { }
    CoordSys(CoordSys parent) : base(parent) { }
    public double LocalPosition { get; set; }
    public double GlobalPosition { get { return IsRoot?LocalPosition:Parent.GlobalPosition+LocalPosition; } }
    public static CoordSys NewRootCoordinate() { return new CoordSys(); }
    public CoordSys NewChildCoordinate(double localPos)
    {
        return new CoordSys(this) { LocalPosition = localPos };
    }
}

static void Main() 
{
    // Make a coordinate tree:
    //
    //                  +--[C:50] 
    // [A:0]---[B:100]--+         
    //                  +--[D:80] 
    //

    var A=CoordSys.NewRootCoordinate();
    var B=A.NewChildCoordinate(100);
    var C=B.NewChildCoordinate(50);
    var D=B.NewChildCoordinate(80);

    Debug.WriteLine(C.GlobalPosition); // 100+50 = 150
    Debug.WriteLine(D.GlobalPosition); // 100+80 = 180
}

请注意,您无法直接实例化Tree.它必须是树中节点类的基类.想一想class Node : Tree { }.

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有