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

时间:2014-09-18 10:32:23

标签: c# closures

我试图在c#中使用闭包创建分层数据。我有一种方法" 配对"看起来像这样:

  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;
    }

比我创建我的分层数据,如下所示:

      var pair = Pair(1,
                        Pair(2,
                              Pair(3,
                                    Pair(4,null))));

当在视觉上表示时,看起来像这样:

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

 public static void Print(Func<string, int> pair)
    {
        if (pair("crd") == null) return;
        Console.WriteLine(pair("con"));
        Print(pair("crd")); //Compilation Error
    }

有人可以告诉我如何在C#中实现这一目标。

1 个答案:

答案 0 :(得分:1)

问题是你的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;
    }
}

试验:

var pair = Pair(1,
            Pair(2,
                  Pair(3,
                        Pair(4, null))));

Print(pair);

输出:

+> 1
|
+> 2
|
+> 3
|
-> 4