2016-04-07 24 views
-1

Lassen Sie uns sagen, dass ich die folgenden Daten haben,Unwind verschachtelte Listen mit C# LINQ

data: { 
    variations: [{ 
     steps: [ 
      { Name: "Crawl", Status: "Complete" }, 
      { Name: "Walk", Status: "InProgress" } 
     ] 
    },{ 
     steps: [ 
      { Name: "Crawl", Status: "Complete" }, 
      { Name: "Walk", Status: "Complete" }, 
      { Name: "Run", Status: "NotStarted" } 
     ] 
    }] 
} 

Wie würde ich bei diesem Satz von Daten kommen mit LINQ? Der resultierende Datensatz besteht aus den eindeutigen Schritten über alle Variationen hinweg.

[ 
    { Name: "Crawl", Status: "Complete" }, 
    { Name: "Walk", Status: "InProgress" }, 
    { Name: "Walk", Status: "Complete" }, 
    { Name: "Run", Status: "NotStarted" } 
] 

Ich habe viele Kombinationen von Select ausprobiert, aber ich habe kein Glück.

+0

Müssen Sie alle [Kombinationen] (http://en.wikipedia.org/wiki/Combination) aus einer Reihe von Objekten erstellen? –

+0

Siehe https://stackoverflow.com/questions/45617525/mongodb-query-find-all-by-userid/45618622#45618622 – elcabezon

Antwort

3

Verwenden Sie .SelectMany(..), und führen Sie .Distinct(...) aus, um das zweite Crawl-Objekt zu entfernen.

var result = data 
    .SelectMany(x => x.Steps) 
    .Distinct() 
    .ToArray(); 

Diese Sie erfordert IEquatable<T> zu implementieren und .GetHashCode() und .Equals() außer Kraft setzen.