泛化构造函数以在 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和加载这样的结构,但如果可能的话,我正在寻找优雅的"单行"方式。我已经努力寻找了很长时间,以寻找如何做到这一点,但找不到任何东西。

泛化构造函数以在 C# 中对数组进行操作

一些 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 代码(如果您想两全其美)。

无论如何,我的两分钱:)希望对您有所帮助。