14

Stackパスのフォルダー階層を含む次のコードがあります。

var path = @"C:\Folder1\Folder2\Folder3\Folder4\Folder5\FileName.ext";

// String array with an element for each level
var folders = path.Split('\\');

var stack = new Stack<string>();

foreach(var folder in folders)
    stack.Push(folder);

var filename = stack.Pop(); // 'FileName.ext'
var parent = stack.Pop(); // 'Folder5'
var grandParent = stack.Pop(); // 'Folder4'

好奇心から、ループなしでfolders配列をに変換するよりエレガントな方法はありますか? (存在しない)次のようなもの:Stackforeach

var folders = path.Split('\\').Reverse().ToStack();

あなたの提案を楽しみにしています!

4

4 に答える 4

32

Stack<T>受け入れるコンストラクターがありますIEnumerable<T>

于 2012-12-19T10:53:15.127 に答える
6

使用できます

var stack = new Stack(folders);

これでもループが実行されることに注意してください。

編集:あなたのコードは a を使用してStackいますが、タイトルは a について尋ねますStack<T>。これは非汎用バージョンです。決心してください:p

于 2012-12-19T10:54:15.713 に答える
2

本当にメソッドが必要なToStack()場合は、拡張メソッドを作成できます。

public static class Extensions {
    public static Stack<T> ToStack(this IEnumerable<T> sequence) {
        return new Stack<T>(sequence);
    }
}

または、他の人が指摘したように、を受け入れるコンストラクターをIEnumerable<T>使用できます。
それは個人的な好みの問題だと思います。

于 2012-12-19T10:55:42.080 に答える