2

次のGroovyコードをC#に変換したいと思います

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

ここからもらった。

これは私が持っているものですが、まだ準備ができておらず、コンパイルもされていません。グルーヴィーなコードを十分に理解していません。

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関数を使用 しました。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();
    }
}

誰か助けてもらえますか?

===更新===

これは私が今持っているものですが、まだ機能していません 。DivideByZeroExceptionがその部分で処理されていませんでしたs.value % s.idx == 0

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));
4

1 に答える 1

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ほどきれいではありませんが、機能します。

于 2012-08-18T14:21:51.890 に答える