C# 是否支持嵌套的强类型树结构?
Does C# support nested strongly typed tree structure?
我想知道 C# 是否有定义 强类型 嵌套锯齿数组 without using 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}}}
};
根据您的用途,您可以使用元组:
var a = (1, 2, (3, (4, 5), 6), 7);
var b = ((1, 2, (3)), 4, (5), (((6))));
限制是创建它们后不能(轻松地)调整它们的大小。
我想像这样改进它的唯一方法。这是强类型的,它允许您根据节点类型拥有单独的逻辑(通过显式 is
检查以确定哪种类型的节点,或者通过执行某种描述操作的 OO 技术作为基础 Node
中的抽象方法,并根据各自的行为方式在 Tree
和 Leaf
中单独实现,或者通过实现 Visitor 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)
)
)
);
我想知道 C# 是否有定义 强类型 嵌套锯齿数组 without using 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}}}
};
根据您的用途,您可以使用元组:
var a = (1, 2, (3, (4, 5), 6), 7);
var b = ((1, 2, (3)), 4, (5), (((6))));
限制是创建它们后不能(轻松地)调整它们的大小。
我想像这样改进它的唯一方法。这是强类型的,它允许您根据节点类型拥有单独的逻辑(通过显式 is
检查以确定哪种类型的节点,或者通过执行某种描述操作的 OO 技术作为基础 Node
中的抽象方法,并根据各自的行为方式在 Tree
和 Leaf
中单独实现,或者通过实现 Visitor 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)
)
)
);