有谁能告诉我如何将以下代码转换为LINQ的最佳方式:
static int MyMethod(MyClass my, bool b)
{
int cnt = 0;
foreach(SomeClass cls in my.SomeMethod()
{
cnt = cnt + cls.length;
}
if(b == true)
{
foreach(MyClass aa in my.SomeOtherMethod())
{
cnt = cnt + MyMethod(aa, true); // recursive
}
}
return cnt;
}
请注意我知道上面的代码工作正常,但我需要在LINQ中编写并进行比较。
答案 0 :(得分:3)
正如Darin所说,如果不明确这样做,你就不能轻易递归 - 但你仍然可以用LINQ来简化这段代码:
static int MyMethod(MyClass my, bool b)
{
int cnt = my.SomeMethod().Sum(cls => cls.length);
if (b)
{
cnt += my.SomeOtherMethod().Sum(aa => MyMethod(aa, true));
}
return cnt;
}
答案 1 :(得分:2)
首先,您应该使用Jon的解决方案,因为它是您可以获得的最简单易读的解决方案。但是,您可以在C#中编写递归Func<...>
声明,因此代码可以像这样重写:
Func<MyClass, bool, int> myFoo = null;
f = (my, b) =>
my.SomeMethod().Sum(cls => cls.length) +
(b ? my.SomeOhterMethod().Sum(aa => myFoo(aa, true)) : 0);
这与Jon发布的内容基本相同,但我使用的是Func<..>
而不是完整方法。 (这对于在LINQ查询中编码递归非常有用,但我认为它很少有用)
答案 2 :(得分:1)
您无法使用LINQ编写递归查询。