泛化构造函数以在 C# 中对数组进行操作
本文关键字:数组 操作 构造函数 泛化 | 更新日期: 2023-09-27 18:32:22
我想知道如何在数组的每个元素上应用构造函数,然后返回构造对象的数组。具体来说,我正在使用 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
和加载这样的结构,但如果可能的话,我正在寻找优雅的"单行"方式。我已经努力寻找了很长时间,以寻找如何做到这一点,但找不到任何东西。
一些 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();
编译器生成的代码对于这两个示例是相同的。
这是一种不同的语法,将给出与您已经得到的其他正确答案相同的结果。
TreeNode[] animalNodes = (from animal in animals select new TreeNode(animal)).ToArray();
虽然其他答案可能有效,但我提出以下替代方案。
我这样做的主要原因是,其他示例要求您实际上使代码看起来稍微复杂一些,并且很明显,您希望清理代码,并使赋值看起来更简单。如果要在应用的不同位置创建这些 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);
结论
这(恕我直言)是比使用 LINQ 更好的选择,因为其他答案提供了,主要是为了代码清晰度、可维护性以及通过将所有这些逻辑放在不同的文件(类似于 TreeNodeBuilder.cs
的文件)中来实现的分离。
对于它的价值,您还可以使用上述 FromStringArray
函数内其他答案中提供的 LINQ 代码(如果您想两全其美)。
无论如何,我的两分钱:)希望对您有所帮助。