2012-12-19 22 views
10

Bir yolun klasör hiyerarşisi içeren bana Stack verir Aşağıdaki kod var: foreach döngü olmadan Stack içine folders dizi dönüştürmek için daha zarif bir şekilde Meraktan soruyorumC# 'da, bir diziyi döngü olmadan Stack <T>'a dönüştürmenin bir yolu var mı?

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' 

var ? Aşağıdaki gibi olmayan (varolmayan) bir şey:

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

Önerilerinizi dört gözle bekliyorum!

+1

Uzantı yöntemi kullanın! – duedl0r

+3

@ duedl0r - bunun için zaten bir kurucu var! –

+0

@JakubKonecki: havalı! – duedl0r

cevap

21

Stack<T>IEnumerable<T>

+5

Genel olmayan sürümde olduğu gibi. Bir "ICollection" kabul eder. –

+0

Harika, teşekkürler - Hayatım boyunca, diğer aşırı yüklere bakmayı düşünmediğimi anlayamıyorum ... –

5

Sen

var stack = new Stack(folders); 

Not kullanabilirsiniz kabul eden bir constructor sahip olduğunu bu yine döngü gerçekleştirir, bu sadece sizin için yapıyor.

Düzenleme: Kodunuz bir Stack kullanıyor, ancak başlığınız bir Stack<T> sorar. Bu jenerik olmayan bir versiyon. Kararını ver: Eğer gerçekten bir ToStack() yöntemi isterseniz p

+0

Oops üzgünüm, gerçek kodumu kestiriyordum ve param ... Bunu bilmek de faydalıdır, bu yüzden +1. –

3

, bir uzantısı yöntemi oluşturabilirsiniz: Diğerleri belirtildiği gibi

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

Veya, bunun için constructor that accepts an IEnumerable<T> kullanabilirsiniz.
Sanırım kişisel tercih meselesi.

İlgili konular