2012-12-19 14 views
10

我有下面的代碼,給了我一個Stack包含路徑的文件夾層次結構:在C#中,有沒有辦法將數組轉換爲堆棧<T>而沒有循環?

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陣列成Stack轉換沒有foreach循環更優雅的方式?有點像(不存在)以下:

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

我期待您的建議!

+1

做一個擴展方法! – duedl0r

+3

@ duedl0r - 已經有一個構造函數了! –

+0

@JakubKonecki:酷! – duedl0r

回答

21

Stack<T>constructor接受IEnumerable<T>

+5

與非通用版本一樣。它接受一個'ICollection'。 –

+0

很好,謝謝 - 我不能爲我的生活弄清楚爲什麼我沒有想到看看其他重載... –

5

您可以使用

var stack = new Stack(folders); 

注意,這仍執行循環,它只是做給你。

編輯:您的代碼使用Stack,但標題詢問Stack<T>。這是非通用版本。要下定決心:對

+0

哎呀抱歉,我正在解釋我的實際代碼,並省略了類型參數...這對於知道太多也很有用,所以+1。 –

3

如果你真的想要一個ToStack()方法,您可以創建一個擴展方法:

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

或者,正如其他人指出的那樣,你可以使用constructor that accepts an IEnumerable<T>它。
這是我個人喜好的問題。

相關問題