如何将此递归代码转换为Linq

时间:2010-06-26 07:05:33

标签: c# linq

有谁能告诉我如何将以下代码转换为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中编写并进行比较。

3 个答案:

答案 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编写递归查询。