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手动加载这样的结构,但如果可能的话,我正在寻找优雅的“单线”方式。我一直在努力寻找如何做到这一点,但找不到任何东西。

4

3 回答 3

7

一些 LINQ 可以解决问题:

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

扩展方法在Select列表的每个成员上执行指定的委托(在此处通过 lambda 指定),并创建结果列表(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);

结论

This (IMHO) is a better option than using LINQ as the other answers provide, mostly for code clarity, maintainability, and the separation you can achieve by putting all of this logic in a different file (a file like TreeNodeBuilder.cs).

For what it is worth you could also use the LINQ code provided in the other answers inside the above FromStringArray function (if you wanted to get the best of both worlds).

Anyways, my two cents :) Hope you find it helpful.

于 2012-04-26T06:47:37.503 回答