3

配列の各要素にコンストラクターを適用して、構築されたオブジェクトの配列を返す方法を知りたかったのです。具体的には、C# のTreeNode. 私が望むコンセプトは次のとおりです。

string[] animals = {"dog","cat","mouse"};
TreeNode[] animalNodes = TreeNode[](animals);

TreeNode[](animals)の累積的な影響はどこにありますか

animalNodes[0] = TreeNode("dog");
animalNodes[1] = TreeNode("cat");
animalNodes[2] = TreeNode("mouse");

このような構造を手動でロードできることはわかっていますforeachが、可能であれば、エレガントな「1行」の方法を探しています。これを行う方法を長い間探しましたが、何も見つかりませんでした。

4

3 に答える 3

7

一部のLINQはトリックを行います:

TreeNode[] animalNodes = animals.Select(a => new TreeNode(a)).ToArray();

拡張メソッドは、指定されたデリゲート (ここSelectではラムダを介して指定) をリストの各メンバーに対して実行し、結果のリストを作成します (IEnumerable<TreeNode>この場合)。次に、ToArray拡張メソッドを使用して、結果から配列を作成します。

または、LINQ のクエリ構文を使用できます。

TreeNode[] animalNodes = (from a in animals select new TreeNode(a)).ToArray();

コンパイラによって生成されるコードは、これらの両方の例で同じです。

于 2012-04-26T06:15:14.890 に答える
0

これは、既に得られた他の正解と同じ結果をもたらす別の構文です。

TreeNode[] animalNodes = (from animal in animals select new TreeNode(animal)).ToArray();
于 2012-04-26T06:23:02.487 に答える
0

他の答えがうまくいくかもしれませんが、私は次の代替案を提案します。

そうする主な理由は、他の例では、実際にはコードをもう少し複雑に見せる必要があり、コードクリーンアップして、割り当てをよりシンプルに見せようとしていることが明らかだからです。このソリューションは、これらの TreeNode をアプリの別の場所に作成する場合にも役立ちます (他のソリューションでは、TreeNode 配列を作成する各場所に割り当てコードをコピー アンド ペーストする必要があります。

割り当てコードをきれいにするコストは、混乱を別の場所に移動することです (しかし、すべてが本当に簡単なので、正直なところ、それほど混乱することはありません)。

まず、TreeNode 配列を構築するためのクラスを作成します。

public static class TreeNodeBuilder
{
    public static TreeNode[] FromStringArray(String[] array)
    {
        TreeNode[] returnValue = new TreeNode[array.Length];

        for(int i = 0; i < array.Length; i++)
        {
            returnValue[i] = new TreeNode(array[i]);
        }

        return returnValue;
    }
}

次に、割り当てコードで、次を使用できます。

String[] animals = {"dog", "cat", "mouse"};
TreeNode[] animalNodes = TreeNodeBuilder.FromStringArray(animals);

結論

これ(IMHO)は、他の回答が提供するLINQを使用するよりも優れたオプションです。主にコードの明確さ、保守性、およびこのロジックをすべて別のファイル(のようなファイル)に入れることで達成できる分離のためですTreeNodeBuilder.cs

価値があるのは、上記の関数内の他の回答で提供されているLINQコードを使用することもできますFromStringArray(両方の世界を最大限に活用したい場合)。

とにかく、私の 2 セント :) お役に立てば幸いです。

于 2012-04-26T06:47:37.503 に答える