2016-03-30 8 views
1

Ich habe ein Objekt, das eine stucture so hat:Verfahrgeschwindigkeit in einem Baum wie Stucture Linq mit

public class CustomObject 
    { 
     public int CustomProperty{get;set;} 
     public string CustomStringProperty{get;set;} 
     public List<CustomObject> CustomObjects{get;set;} 
    } 

Ich weiß, dass es viele Wege gibt, wo ich jedes Objekt nach oben ziehen, übergeordnetem Objekt oder eine immer Objekt basierend auf der Bedingung in der CustomProperty.

Ich möchte einige Erweiterung Methoden oder Linq schreiben, so dass Client Zugriff auf jedes Objekt und seine Eigenschaften haben kann.

Derzeit Kunde hat Liste ->List<CustomObject>();

zB. ClientMethod(List<CustomObject> customObjs);

+0

Ich bin mir nicht sicher, was Sie suchen, aber ich kann es erwarten. Versuchen Sie den folgenden Indexer: https://msdn.microsoft.com/en-us/library/6x16t2tx.aspx –

+0

Keine direkte Antwort auf Ihre Frage, aber Sie können einen Blick auf https://dvanderboom.wordpress.com/ 2010/04/05/Vier-Traversal-Patterns-for-Treet / –

Antwort

1

Angenommen, Sie möchten die Elemente in der Liste und alle ihre untergeordneten Elemente durchsuchen können.

Wie üblich bei solchen Fragen, würde ich Ihnen vorschlagen, die hocheffiziente allgemeine Baum Vorordnungsdurchquerung Methode von How to flatten tree via LINQ? zu erhalten:

public static partial class TreeHelper 
{ 
    public static IEnumerable<T> Expand<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> elementSelector) 
    { 
     var stack = new Stack<IEnumerator<T>>(); 
     var e = source.GetEnumerator(); 
     try 
     { 
      while (true) 
      { 
       while (e.MoveNext()) 
       { 
        var item = e.Current; 
        yield return item; 
        var elements = elementSelector(item); 
        if (elements == null) continue; 
        stack.Push(e); 
        e = elements.GetEnumerator(); 
       } 
       if (stack.Count == 0) break; 
       e.Dispose(); 
       e = stack.Pop(); 
      } 
     } 
     finally 
     { 
      e.Dispose(); 
      while (stack.Count != 0) stack.Pop().Dispose(); 
     } 
    } 
} 

und nutzen es für Ihre Bedürfnisse (Sie einen anderen Namen verwenden können, wenn Sie don ‚t mag es):

partial class TreeHelper 
{ 
    public static IEnumerable<CustomObject> Expand(this IEnumerable<CustomObject> source) 
    { 
     return source.Expand(item => item.CustomObjects != null && item.CustomObjects.Count > 0 ? item.CustomObjects : null); 
    } 
} 

Dann können Sie verwenden einfach:

void ClientMethod(List<CustomObject> customObjs) 
{ 
    foreach (var item in customObjs.Expand()) 
    { 
     // do something 
    } 
} 

oder LINQ Abfragen wie customObjs.Expand().Where(...) usw.

Verwandte Themen