在C#中使用闭包创建分层数据?
我正在尝试使用c#中的闭包创建分层数据。我有一个方法“Pair”,它如下所示:在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;
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