Feedback

C# - LINQ: Hierarchie flach machen

Veröffentlicht von am 06.08.2016
(0 Bewertungen)
Diese kleine Erweiterungsmethode dient zum "flach machen" einer hierarchische Objekt-Struktur.
Angenommen man hat in Windows Forms eine TreeView und möchte sämtliche Items in eine ListBox übertragen. Dann geht das mit meiner Methode in nur einer Zeile:
this.listBox1.Items.Clear();
this.listBox1.Items.AddRange(
this.treeView1.Nodes
.Cast<TreeNode>()
.SelectMany(x => x.Flatten(y => y.Nodes.Cast<TreeNode>()))
.Select(x => (object)x.Text)
.ToArray());

Sofern man generische Listen nutzt kann man sich den Cast auch sparen, hier allerdings wird er benötigt.

Benötigte Namespaces
System
System.Collections.Generic
System.Linq
GFU-Schulungen  [Anzeige]

Visual Studio Team Foundation Server 2017/2015 (TFS) für Administratoren - Kompakt

Nach dieser Schulung beherrschen Sie die Grundlagen des TFS. Sie erledigen administrative Aufgaben schnell und sicher.

VB.NET Einführung

Die Schulung zeigt Ihnen, wie Sie einfache, benutzerorientierte Programme, die auf Datenbanken zugreifen, in VB.NET eigenständig entwickeln. 

/// <summary>
/// Verflacht eine hierarchische Objekt-Struktur.
/// </summary>
/// <typeparam name="T">Der Typ der Elemente in der Hierachie</typeparam>
/// <param name="item">Das Root-Objekt dessen Sub-Elemente verflacht werden sollen. Dieses wird als erstes in die Rückgabeliste gegeben.</param>
/// <param name="selector">Eine Funktion zum Auswählen der Unter-Elemente unter einem Element.</param>
/// <returns>Eine Auflistung aller Elemente unter <paramref name="item"/> inklusive <paramref name="item"/> selbst</returns>
public static IEnumerable<T> Flatten<T>(this T item, Func<T, IEnumerable<T>> selector)
{
    yield return item;
    foreach (var subSubItem in selector(item).SelectMany(subItem => Flatten(subItem, selector)))
    {
        yield return subSubItem;
    }
}

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!