例如目录列表:/// <summary>从文件路径建立目录树</summary>
public class PathTree : IEnumerable<KeyValuePair<string, PathTree>>
{
private readonly SortedList<string, PathTree> children = new SortedList<string, PathTree>();
/// <summary>将给定的键值序列添加到当前树中,各键值将作为各级子节点的值</summary>
public PathTree AddFileName(IEnumerable<string> fileNameSegment)
{
PathTree node = this;
foreach (var segment in fileNameSegment)
{
PathTree child;
if (node.children.TryGetValue(segment, out child) == false)
{
child = new PathTree();
node.children.Add(segment, child);
}
node = child;
}
return node;
}#region GetFileNames
/// <summary>得到所有的文件名列表</summary>
public IEnumerable<IEnumerable<string>> GetFileNames()
{
return GetFileNames(this);
}
/// <summary>得到给定目录下所有的文件名列表</summary>
public IEnumerable<IEnumerable<string>> GetFileNames(IEnumerable<string> directorySegment)
{
PathTree node = this;
foreach (var segment in directorySegment)
{
PathTree child;
if (node.children.TryGetValue(segment, out child) == false)
return Enumerable.Empty<IEnumerable<string>>();
node = child;
}
return GetFileNames(node);
}
/// <summary>得到给定节点的所有子节点的值</summary>
private static IEnumerable<IEnumerable<string>> GetFileNames(PathTree root)
{
foreach (var child in root.children)
{
var cur = new string[] { child.Key };
if (child.Value.children.Count == 0)
yield return cur;
else
{
var lower = GetFileNames(child.Value);
foreach (var group in lower)
yield return cur.Concat(group);
}
}
}
#endregion#region IEnumerable
public IEnumerator<KeyValuePair<string, PathTree>> GetEnumerator()
{
return children.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
#endregion#region XElement
public IEnumerable<XElement> ToXElements()
{
foreach (var child in children)
yield return new XElement("node", new XAttribute("value", child.Key), child.Value.ToXElements());
}
public override string ToString()
{
return new XElement("tree", ToXElements()).ToString(SaveOptions.None);
}
#endregion
}
dir1\dir1\file1dir1\dir1\file2dir1\dir2\file1dir1\file1dir1\file2dir2\dir1dir2file1
通过GetFileNames方法重新展开的文件路径为:<tree>
<node value="dir1">
<node value="dir1">
<node value="file1" />
<node value="file2" />
</node>
<node value="dir2">
<node value="file1" />
</node>
<node value="file1" />
<node value="file2" />
</node>
<node value="dir2">
<node value="dir1" />
</node>
<node value="file1" />
</tree>
dir1\dir1\file1dir1\dir1\file2dir1\dir2\file1dir1\file1dir1\file2dir2\dir1file1
评论