2012-12-19 13 views
10

Mam następujący kod, który daje mi Stack zawierający hierarchię folderów ścieżki:W języku C#, czy istnieje sposób konwertowania tablicy do stosu <T> bez pętli?

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' 

Tak z ciekawości, czy istnieje bardziej elegancki sposób przekonwertować tablicę do Stackfolders bez pętli foreach ? Coś w stylu (nieistniejącego):

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

Czekam z niecierpliwością na Twoje sugestie!

+1

Wykonaj metodę przedłużenia! – duedl0r

+3

@ duedl0r - istnieje już dla niego konstruktor! –

+0

@JakubKonecki: fajnie! – duedl0r

Odpowiedz

21

Stack<T> ma constructor że akceptuje IEnumerable<T>

+5

Podobnie jak wersja nietypowa. Akceptuje "ICollection". –

+0

Wspaniale, dziękuję - nie mogę dla mojego życia dowiedzieć się, dlaczego nie pomyślałem by spojrzeć na inne przeciążenia ... –

5

Można użyć

var stack = new Stack(folders); 

pamiętać, że ten nadal wykonuje pętli, to po prostu zrobi to za Ciebie.

Edytuj: Twój kod używa numeru Stack, ale Twój tytuł pyta o numer Stack<T>. To jest wersja nietypowa. Złóż swój umysł up: p

+0

Oops przepraszam, parafrazowałem mój aktualny kod i pominąłem typ ... przydaje się to również wiedzieć, więc +1. –

3

Jeśli naprawdę chcesz metodę ToStack() można utworzyć metodę rozszerzenia:

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

Albo, jak inni zauważyć, można użyć constructor that accepts an IEnumerable<T> dla niego.
Sądzę, że to kwestia osobistych preferencji.

Powiązane problemy