我想知道如何在数组的每个元素上应用构造函数,然后返回构造对象的数组。具体来说,我正在使用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
手动加载这样的结构,但如果可能的话,我正在寻找优雅的“一线”方式。我看起来很长很难,但是找不到任何东西。
答案 0 :(得分: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();
编译器生成的代码对于这两个示例都是相同的。
答案 1 :(得分:0)
这是一种不同的语法,可以提供与您已经获得的其他正确答案相同的结果。
TreeNode[] animalNodes = (from animal in animals select new TreeNode(animal)).ToArray();
答案 2 :(得分:0)
虽然其他答案可能有效,但我提出以下备选方案。
我这样做的主要原因是其他示例要求您实际使代码看起来有点更多复杂,并且很明显您正在寻找清理代码,并且使分配看起来更简单。如果您要在应用程序的不同位置创建这些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更好的选择,因为其他答案提供,主要是为了代码清晰度,可维护性,以及通过将所有这些逻辑放在不同的文件({{1 }})。
对于它的价值,你也可以使用上面TreeNodeBuilder.cs
函数中其他答案中提供的LINQ代码(如果你想充分利用这两个世界)。
无论如何,我的两分钱:)希望你觉得它有用。