Burada sunulan yanıtların çoğu önce derinlik veya zikzak dizileri üretiyor . Örneğin aşağıdaki ağaçtan başlayarak:
1 2
/ \ / \
/ \ / \
/ \ / \
/ \ / \
11 12 21 22
/ \ / \ / \ / \
/ \ / \ / \ / \
111 112 121 122 211 212 221 222
dasblinkenlight'ın cevabı bu düzleştirilmiş diziyi oluşturur:
111, 112, 121, 122, 11, 12, 211, 212, 221, 222, 21, 22, 1, 2
Konamiman en cevabı (genelleştirir Eric Lippert'ın en o cevabı ) Bu düzleştirilmiş diziyi üretir:
2, 22, 222, 221, 21, 212, 211, 1, 12, 122, 121, 11, 112, 111
Ivan Stoev'in cevabı bu düzleştirilmiş sekansı oluşturur:
1, 11, 111, 112, 12, 121, 122, 2, 21, 211, 212, 22, 221, 222
Bunun gibi enine bir diziyle ilgileniyorsanız :
1, 2, 11, 12, 21, 22, 111, 112, 121, 122, 211, 212, 221, 222
... o zaman bu sizin için çözüm:
public static IEnumerable<T> Flatten<T>(this IEnumerable<T> source,
Func<T, IEnumerable<T>> childrenSelector)
{
var queue = new Queue<T>(source);
while (queue.Count > 0)
{
var current = queue.Dequeue();
yield return current;
var children = childrenSelector(current);
if (children == null) continue;
foreach (var child in children) queue.Enqueue(child);
}
}
Gerçekleştirmedeki fark temelde a Queue
yerine a kullanmaktır Stack
. Gerçek bir sıralama gerçekleşmiyor.
Dikkat: Bu uygulama bellek verimliliği açısından optimal olmaktan uzaktır, çünkü toplam öğe sayısının büyük bir yüzdesi numaralandırma sırasında dahili kuyrukta depolanır. Stack
-based ağaç geçişleri- Queue
tabanlı uygulamalara göre bellek kullanımı açısından çok daha verimlidir .