Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实现泛型树c的IEnumerable#_C#_Generics_Ienumerable - Fatal编程技术网

C# 实现泛型树c的IEnumerable#

C# 实现泛型树c的IEnumerable#,c#,generics,ienumerable,C#,Generics,Ienumerable,我有一个通用树类,我想为它实现IEnumerable接口。我以前在stackoverflow上发现的问题与我的问题有点不同。我知道我在干什么,但我不知道那是什么。这是我的密码: class Node<T>: IEnumerable<T> { private T data; private LinkedList<Node<T>> children; public Node(T data) { this

我有一个通用树类,我想为它实现IEnumerable接口。我以前在stackoverflow上发现的问题与我的问题有点不同。我知道我在干什么,但我不知道那是什么。这是我的密码:

class Node<T>: IEnumerable<T>
{
    private T data;
    private LinkedList<Node<T>> children;

    public Node(T data)
    {
        this.data = data;
        children = new LinkedList<Node<T>>();
    }

    public void AddChildNode(Node<T> node)
    {
        children.AddFirst(node);
    }

    public void MyTraverse(Node<T> node, List<T> visited)
    {
        visited.Add(node.data);
        foreach (Node<T> kid in node.children)
            MyTraverse(kid, visited);

    }

    public IEnumerator<T> GetEnumerator()
    {
        return children.GetEnumerator();
    }


    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
类节点:IEnumerable
{
私有T数据;
私人关系人子女;
公共节点(T数据)
{
这个数据=数据;
children=newlinkedlist();
}
公共void AddChildNode(节点节点)
{
AddFirst(节点);
}
公共void MyTraverse(节点,访问列表)
{
添加(节点数据);
foreach(Node.children中的节点kid)
MyTraverse(儿童,探访);
}
公共IEnumerator GetEnumerator()
{
返回children.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
返回GetEnumerator();
}
}

在函数GetEnumerator()中,我得到了一个不知道如何修复的强制转换错误。有谁能帮我吗?

您可能想要
IEnumerable
接口实现(您正在枚举节点
Node
,而不是
T
实例),而不是
IEnumerable
一个:

 class Node<T>: IEnumerable<Node<T>> {
   ...
    public IEnumerator<Node<T>> GetEnumerator() {
      return children.GetEnumerator();
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
      return GetEnumerator();
    }
 }
类节点:IEnumerable{
...
公共IEnumerator GetEnumerator(){
返回children.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator(){
返回GetEnumerator();
}
}

问题在于
子项的定义如下:

private LinkedList<Node<T>> children;
如果只希望返回子项,请使用以下代码:

public IEnumerator<T> GetEnumerator()
{
    return children.Select(node => node.data);
}
public IEnumerator GetEnumerator()
{
返回children.Select(node=>node.data);
}

获取枚举器类似于:

 public IEnumerator<Node<T>> GetEnumerator()
    {
        return children.GetEnumerator();
    }
public IEnumerator GetEnumerator()
{
返回children.GetEnumerator();
}
公共类节点:IEnumerable
{
公共字符串名称{get;internal set;}
公共字符串值{get;内部集;}
公共节点父节点{get;内部集;}
公共列表子项{get;内部集;}
公共节点(字符串名称)
{
if(string.IsNullOrEmpty(name))
抛出新的ArgumentException($“{nameof(Name)}”);
名称=名称;
Children=新列表();
}
IEnumerator IEnumerable.GetEnumerator()
=>GetEnumerator();
公共IEnumerator GetEnumerator()
{
var self=这个;
var queue=新队列();
排队。排队(自我);
while(queue.Any())
{
让出返回队列。退出();
foreach(self.Children中的var child)
排队。排队(子级);
}
}             
}
此外,这也是可行的,代码更少:

     public IEnumerator<Node> GetEnumerator()
    {
        var self = this;
        yield return self;

        foreach (var child in self.Children)
            yield return child;
    }
public IEnumerator GetEnumerator()
{
var self=这个;
收益自回归;
foreach(self.Children中的var child)
退换子女;
}

请发布错误消息。错误消息:错误1无法将类型“System.Collections.Generic.LinkedList.Enumerator”隐式转换为“System.Collections.Generic.IEnumerator”D:\BoxSync\amirho\Categories\Implementation\SAT\u Solvers\Z3\Microsoft\u Example\u Added\Microsoft\u Added\Node.cs 35 20 Microsoft\u Example\u Added\T在签名并不能解决问题!一件事是让方法编译,另一件事是让它做你想要的。你希望它做什么和返回?要使其编译,只需执行
返回children.Select(node=>node.data)public class Node : IEnumerable<Node>
{
    public string Name { get; internal set; }
    public string Value { get; internal set; }

    public Node Parent { get; internal set; }
    public List<Node> Children { get; internal set; }

    public Node(string name)
    {
        if (string.IsNullOrEmpty(name))
            throw new ArgumentException($"{nameof(Name)}");

        Name = name;
        Children = new List<Node>();
    }

    IEnumerator IEnumerable.GetEnumerator()
        => GetEnumerator();

    public IEnumerator<Node> GetEnumerator()
    {
        var self = this;
        var queue = new Queue<Node>();
        queue.Enqueue(self);

        while (queue.Any())
        {
            yield return queue.Dequeue();
            foreach (var child in self.Children)
                queue.Enqueue(child);
        }
    }             
}
     public IEnumerator<Node> GetEnumerator()
    {
        var self = this;
        yield return self;

        foreach (var child in self.Children)
            yield return child;
    }