我试图在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#中实现这一目标。
答案 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