已經掙扎了幾天,現在仍然難倒。 我有一個數據結構,從可以容納其他容器的容器開始,最後是葉節點。我正在尋找一種直接迭代類型元素的方式,而不需要將它們拉入另一個集合中,這樣我就可以對它們進行操作,然後將結果保存到外面。c#遞歸泛型數據結構搜索
下面的代碼是一個noddy版本,如果你在每個findElements函數上設置一個斷點,你會發現它沒有遞歸就退出。這是單聲道和MS運行時間,所以我敢肯定,這是我沒有得到的東西,而不是一個錯誤;)
也,功能最好應
IEnumerable<object> findElements<T>();
,但我不能讓投要在這一行工作,那麼:
if (this is T) yield return this;
理論上應
if (this is T) yield return (T)this;
感謝您的任何建議/ CLA rity/light
using System;
using System.Collections.Generic;
using System.Text;
namespace covariantTest {
class MainClass {
public static void Main(string[] args) {
Console.WriteLine("Starting");
Document root = new Document("rooty");
root.Children.Add(new File("file 1"));
root.Children.Add(new File("file 2"));
Document doc2 = new Document("doc2");
File file3 = new File("file 3");
file3.Lines.Add(new Line("line 1 file 3"));
file3.Lines.Add(new Line("line 2 file 3"));
doc2.Children.Add(file3);
File file4 = new File("file 4");
file4.Lines.Add(new Line("stuff about stuff"));
file4.Lines.Add(new Line("Babylon n ting"));
file4.Lines.Add(new Line("last line"));
doc2.Children.Add(file4);
root.Children.Add(doc2);
// find the lines
foreach (object obj in root.findElements<Line>()) {
Line line = obj as Line;
Console.WriteLine(line.Contents);
}
// done
Console.WriteLine("Press enter to finish");
Console.ReadLine();
}
}// Main
#region classes
public class Line : ISearchable {
private string _contents = string.Empty;
public Line() {}
public Line(string contents) {
_contents = contents;
}
#region properties
public string Contents {
get { return _contents; }
set { _contents = value; }
}
#endregion properties
public IEnumerable<object> findElements<T>() {
if (this is T) yield return this;
}
}// Line
public class File : Container {
private List<Line> _lines = new List<Line>();
public File() : base() {}
public File(string name) : base(name) {}
#region properties
public List<Line> Lines {
get { return _lines; }
set { _lines = value; }
}
#endregion properties
public override IEnumerable<object> findElements<T>() {
if (this is T) yield return this;
else base.findElements<T>();
}
}// File
public class Document : Container {
public Document() : base() {}
public Document(string name) : base(name) {}
public override IEnumerable<object> findElements<T>() {
if (this is T) yield return this;
else base.findElements<T>();
}
}// Document
public abstract class Container : ISearchable {
private string _name = string.Empty;
private List<Container> _children = new List<Container>();
public Container() {}
public Container(string name) {
_name = name;
}
#region properties
public string Name {
get { return _name; }
set { _name = value; }
}
public List<Container> Children {
get { return _children; }
set { _children = value; }
}
#endregion properties
#region interfaces
public virtual IEnumerable<object> findElements<T>() {
if (this is T) yield return this;
foreach (Container item in _children) {
item.findElements<T>();
}
}
#endregion interfaces
}// Container
#endregion classes
#region interfaces
public interface ISearchable {
IEnumerable<object> findElements<T>();
}
#endregion interfaces
}// namespace
你好, 謝謝你的回覆。 它實際上用於處理kml文件,因此可能非常複雜和深入。我必須看看Action,因爲我之前沒有使用它,唯一的問題是,我看到的是,並非樹的所有部分都是Item類型,因此該操作必須是通用的,關閉有一個玩,那麼謝謝:) – 2009-11-08 18:17:27
KML?...我創建了一個庫來解析樹中的collada文件(Google倉庫),然後將樹渲染爲WPF 3D元素。那是你在尋找什麼? – venezia 2009-11-09 04:51:43