C# 实现泛型树c的IEnumerable#
我有一个通用树类,我想为它实现IEnumerable接口。我以前在stackoverflow上发现的问题与我的问题有点不同。我知道我在干什么,但我不知道那是什么。这是我的密码: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
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;
}