gpt4 book ai didi

c# - 层次类的迭代器

转载 作者:行者123 更新时间:2023-11-30 22:57:50 25 4
gpt4 key购买 nike

我有一个 C# 类来定义层次结构(比下面的示例复杂得多)。该类有一个 Parent,可能还有同一个类的 Children

我正在尝试为顶级对象编写一个迭代器,它将允许我访问 foreach 循环中的所有内容。

class Node
{
public Node Parent { get; private set; }
public bool HasParent { get { return (Parent != null); } }
public string Name { get; private set; }
public bool IsAnimal { get; set; }
public bool IsCar { get; set; }
public List<Node> Children { get; private set; }
public bool HasChildren { get { return (Children != null); } }

}

想这样访问:

foreach (Node myNode in TopNode.Contents)

如果有多个迭代器来遍历不同类型的 Children 就好了,比如:

foreach (Node myNode in TopNode.Animals)

foreach (Node myNode in TopNode.Cars)

最佳答案

将此方法添加到 Node 类:

public IEnumerable<Node> DescendantsAndSelf()
{
yield return this;
if (Children != null) {
foreach (Node child in Children) {
foreach (Node node in child.DescendantsAndSelf()) {
yield return node;
}
}
}
}

并且您不需要为不同类型的节点使用不同的迭代器。只需使用 .Where(...)

var allAnimals = myTopNode.DescendantsAndSelf()
.Where(n => n.IsAnimal);

如果您认真考虑@LasseVågsætherKarlsen 的建议并从抽象基类 Node 派生不同的节点类型,那么您可以将动物类型设置为 Animal,如下所示:

IEnumerable<Animal> allAnimals = myTopNode.DescendantsAndSelf()
.OfType<Animal>();

您还可以将 Children 声明为:

public List<Node> Children { get; } = new List<Node>();

像这样,Children 永远不会为空,HasChildren 将实现为:

public bool HasChildren => Children.Count > 0;

参见:

关于c# - 层次类的迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53364730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com