如何将此Groovy函数转换为C#?

时间:2012-08-18 12:13:25

标签: c#-4.0 groovy

我想将以下Groovy代码转换为C#

def find_perfect_numbers(def number) {
  (2..number).findAll { x-> (1..(x/2)).findAll{ x % it == 0 }.sum() == x }
}

我是从here获得的。

这就是我所拥有的,但它还没有准备好,也没有编译。我不太了解groovy代码。

public List<int> find_perfect_numbers(int number)
{
    List<int> lst = new List<int>();

    lst = 2.To(number).FindAll(x => (1.To(x/2)).FindAll( x % it == 0).Sum() == x);

    return lst;
}

我无法翻译部分x % it == 0(因为“它”是一个索引)。

  • 我希望C#代码看起来和groovy函数一样多。具体而言,行lst = 2.To( ....
  • 我不想使用不同的解决方案来找到完美的数字(我已经有了另一个工作功能)。对我来说,这只是关于语法,而不是一个好的“完美数字函数”。
  • 创建新的(扩展)函数可以帮助这样做,就像我使用的To函数一样:

对于上面的To函数,我使用了这个StackOverflow函数: Generating sets of integers in C# 并稍微改变它,以便它返回一个int的列表而不是一个int

的数组
public static class ListExtensions
{
    public static List<int> To(this int start, int end)
    {
        return Enumerable.Range(start, end - start + 1).ToList();
    }
}

任何人都可以帮助我吗?

===更新===

这就是我现在所拥有的,但它还没有工作,我明白了 部件s.value % s.idx == 0上的 DivideByZeroException未处理

lst = 2.To(number).FindAll(x => ((1.To(x / 2)).Select((y, index) => new {value = y, idx = index}).Where( s => s.value % s.idx == 0).Sum(t => t.value) == (decimal)x));

1 个答案:

答案 0 :(得分:2)

我自己找到了。

lst = 2.To(number)
       .FindAll(x => ((1.To(x / 2))
       .Select((y, index) => new {value = y, idx = index+1})
       .Where( s => x % s.idx == 0)
       .Sum(t => t.value) == (decimal)x));

不像Groovy那样漂亮,但它有效。