2
我想讓一個路徑的所有父母都沒有顯式循環,這樣我就可以完全消除這個方法。使用linq獲取路徑的所有父母
private static IEnumerable<string> GetParentPaths(string path)
{
while (Path.GetDirectoryName(path) != Path.GetPathRoot(path))
{
path = Path.GetDirectoryName(path);
yield return path;
}
}
這怎麼可能幹淨地用LINQ來完成?鑑於
c:\a\b\c
應返回如下(順序並不重要)
c:\a
c:\a\b
更新:
@Tomas Petricek的回答使我Jon Skeet's Generator implementation我結束了具有以下內容:
path.Generate(Path.GetDirectoryName)
.Skip(1) // the original
.TakeWhile(p => p != Path.GetPathRoot(p))
使用
public static class TExtensions
{
public static IEnumerable<T> Generate<T>(this T initial, Func<T, T> next)
{
var current = initial;
while (true)
{
yield return current;
current = next(current);
}
}
}
'current == default(T)'似乎沒有編譯,除非Generate方法用'where T:class'標記 - 同樣'return'在那行應該是'yield break' – Handcraftsman 2011-03-13 17:52:27
@Handcraftsman:謝謝爲更正。 Stackoverflow沒有內置的C#編譯器:-)不幸的。 – 2011-03-13 18:12:24