在C#中使用闭包创建分层数据?

在C#中使用闭包创建分层数据?,c#,closures,C#,Closures,我正在尝试使用c#中的闭包创建分层数据。我有一个方法“Pair”,它如下所示: public static Func<string, int> Pair(int x,Func<string, int> y) { Func<string, int> pair = (a) => { if (a == "con") return x;

我正在尝试使用c#中的闭包创建分层数据。我有一个方法“Pair”,它如下所示:

  public static Func<string, int> Pair(int x,Func<string, int> y)
    {

        Func<string, int> pair =
               (a) =>
               {
                   if (a == "con") return x;
                   if (a == "crd") return y("con");
                   throw new Exception();
               };

        return pair;
    }
在视觉上呈现时,如下所示:

我知道这种方法有缺陷,因为我无法获取/打印成对存储的所有值。我不能做这样的事:

 public static void Print(Func<string, int> pair)
    {
        if (pair("crd") == null) return;
        Console.WriteLine(pair("con"));
        Print(pair("crd")); //Compilation Error
    }
公共静态无效打印(Func对)
{
如果(对(“crd”)==null)返回;
控制台写入线(配对(“con”);
打印(对(“crd”);//编译错误
}

有人能告诉我如何在C#中实现这一点吗?

问题是,Pair闭包需要能够返回两种不同类型的对象:如果要求“con”,则返回int;如果要求“crd”,则返回行中的下一个闭包

下面是一个可能的实现:

使用动态链接,以便可以返回其中一个

public static Func<string, dynamic> Pair(int x, Func<string, dynamic> y)
{
    Func<string, dynamic> pair =
           (a) =>
           {
               if (a == "con") return x;
               if (a == "crd") return y;
               throw new Exception();
           };

    return pair;
}

public static void Print(Func<string, dynamic> pair)
{
    while (true)
    {
        var next = pair("crd");
        Console.WriteLine((next == null ? "-":"+") +"> " + pair("con"));
        if (next != null)
        {
            Console.WriteLine("|");
            pair = (x) => next(x);
            continue;
        }
        break;
    }
}
输出:

+> 1
|
+> 2
|
+> 3
|
-> 4
var pair = Pair(1,
            Pair(2,
                  Pair(3,
                        Pair(4, null))));

Print(pair);
+> 1
|
+> 2
|
+> 3
|
-> 4