C#是否支持嵌套的强类型树结构? [重复]

问题描述 投票:0回答:2

这个问题在这里已有答案:

我想知道C#是否有一种方法可以在不使用object[]的情况下定义强类型的嵌套锯齿状数组。

就像是:

var nested = new {1, 2, {3, {4, 5}, 6}, 7};

我想有一个嵌套的int数组。

请考虑以下数组:[[1, 2, [3]], 4, [5], [[[6]]]]

这就是我做到的方式:

var myNestedJagged = new object[]
{
    new object[]
    {
        1, 2, new object[] {3}
    },
    4,
    new object[] {5},
    new object[] {new object[] {new object[] {6}}}
};
c# arrays jagged-arrays
2个回答
3
投票

我能想到改善它的唯一方法就是这样。这是强类型的,它允许您根据节点的类型具有单独的逻辑(通过执行显式is检查以确定哪种类型的节点,或通过执行某种操作被描述为抽象方法的OO技术在基地Node并根据每个应该如何表现,或通过实施Tree分别在LeafVisitor pattern实施。

// all items are nodes
abstract class Node
{
}

// a tree is just a collection of nodes; it has no value
class Tree : Node
{
    public Tree(params Node[] children)
    {
        Children = children;
    }
    public IReadOnlyCollection<Node> Children { get; }
}

// a leaf is just a value; it has no children
class Leaf : Node
{
    public Leaf(int value)
    {
        Value = value;
    }
    public int Value { get; }
}

但是,这种结构有点难看。

var myTree = new Tree(
    new Tree(
        new Leaf(1),
        new Leaf(2),
        new Tree(
            new Leaf(3)
        )
    ),
    new Leaf(4),
    new Tree(
        new Leaf(5)
    ),
    new Tree(
        new Tree(
            new Leaf(6)
        )
    )
);

0
投票

根据您的使用情况,您可以使用元组:

var a = (1, 2, (3, (4, 5), 6), 7);
var b = ((1, 2, (3)), 4, (5), (((6))));

限制是在您创建它们之后,您无法(轻松地)调整它们的大小。

© www.soinside.com 2019 - 2024. All rights reserved.