我写了下面的扩展来遍历递归目录/文件树。这可能不是您的确切情况,但听起来很相似。我希望代码有所帮助。
public static IEnumerable<Tuple<TValue, string>> TraverseValuesWithPaths<T, TValue>(this IEnumerable<T> items,
Func<T, IEnumerable<T>> childSelector, Func<T, IEnumerable<TValue>> valueSelector, Func<T, string> childNameSelector, Func<TValue, string> valueNameSelector, string pathStart = null, string separator = null)
{
Func<string, string, string> pathCombine = (a, b) => string.Concat(a, separator, b);
var stack = new Stack<Tuple<T, string>>(items.Select(i => new Tuple<T, string>(i, pathCombine(pathStart, childNameSelector(i)))));
while (stack.Any())
{
var next = stack.Pop();
foreach (var child in childSelector(next.Item1))
{
stack.Push(new Tuple<T, string>(child, pathCombine(next.Item2, childNameSelector(child))));
}
var values = valueSelector(next.Item1);
if (values != null)
{
foreach (var value in values)
{
yield return new Tuple<TValue, string>(value, pathCombine(next.Item2, valueNameSelector(value)));
}
}
}
}
用法
// produce flat list of files and path
var allFiles = folders.TraverseValuesWithPaths(folder => folder.Folders, folder => folder.Files, folder => folder.Name, file => file.Name, "\"", "\"");