2016-05-12 11 views
0

I aa benutzerdefinierten Typ wie die folgenden haben:abrufen alle Felder mit dem gleichen Namen und Typ C#

public class Parent 
{ 
    public int Id; 
    public List<Child1> C1; 
    public List<Child2> C2; 

} 

public class Child1 
{ 
    public int Id; 
} 

public class Child2 
{ 
    public int Id; 
    public Child3 C3; 
} 

public class Child3 
{ 
    public int Id; 
} 

Ich habe eine Liste der übergeordneten Klasse

List<Parent> parent = new List<Parent>(); 

Was ist der beste Weg ist, zu erhalten alle ID-Felder des 'Eltern' in einer Liste?

Der einfachste Weg wäre, eine verschachtelte foreach-Schleife zu verwenden, aber ist das ein sauberer Weg?

möchte ich die Ids aller übergeordneten Objekte sowie die Ids ihrer rekursiven Child-Objekte in einer Liste als

List<int> AllIds 
+1

Können Sie Ihre Frage anders formulieren? Es ist unklar, was dein Ziel ist. Möchten Sie einfach die Eltern-IDs oder einige Kind-IDs auswählen? – Marco

+0

Jede Art, wie Sie es schneiden, wird es auf _some_ Art von verschachtelten Schleife, entweder explizit, mit LINQ, etc. – AntiTcb

+3

_ "Der einfachste Weg wäre, eine verschachtelte foreach-Schleife zu verwenden, ist aber ein sauberer Weg" _ Wenn das ist der einfachste Weg für Sie und Ihre Kollegen, verwenden Sie es. Easy ist sauber, wenn es funktioniert. –

Antwort

0

Wenn Sie die LINQ-Lösung

List<Parent> parent = new List<Parent>(); 
var parentIds = parent. 
    Select(p => p 
     // take C2 ids and C3 ids foreach Parent 
     .C2.SelectMany(c2 => new List<string> { c2.Id, c2.C3.Id}) 
     // Add each C1 id foreach parent 
     .Union(p.C1.Select(c1 => c1.Id)) 
     // Add its own id 
     .Concat(new List<string> { p.id }) 
    ); 
-1

Holen Sie sich alle Eltern wollen ids:

List<Parent> parents = new List<Parent>(); 
// populate parent list 

int[] parentIds = parents.Select(s => s.Id).ToArray(); 
+3

Ich könnte falsch liegen, aber es sieht so aus, als ob OP auch alle IDs der Kinder haben möchte. –

+0

@ s.m. Richtig, ich sah gerade die Bearbeitung –

+0

Was, wenn wir die Ids der Child1 und Child2 auch in der gleichen Liste wollen? – Ross

2

Sie könnten eine AllIDs Eigenschaft Parent hinzufügen

public IEnumerable<int> AllIDs 
{ 
    get 
    { 
    yield return Id; 

    foreach(var child in C1) 
    { 
     yield return child.Id; 
    } 

    foreach(var child in C2) 
    { 
     yield return child.Id; 
     yield return child.C3.Id; 
    } 
    } 
} 

Jetzt können Sie einen SelectMany tun auf der parent Variable

var ids = parent.SelectMany(p => p.AllIDs).ToList(); 
1

Sie verwenden SelectMany und Enumerable.Concat:

List<int> allIds = parent 
    .SelectMany(p => new[] { p.Id } // or Enumerable.Repeat(p.Id, 1) 
     .Concat(p.C1.Select(c => c.Id)) 
     .Concat(p.C2.Select(c => c.Id))) 
    .ToList(); 

Wenn Sie stattdessen, ob eine ID wollen wissen, ein Kind war oder Eltern-ID Sie könnten einen anonymen Typ auswählen, der den Typ und die Eltern-ID enthält, falls verfügbar:

var allIds = parent 
    .SelectMany(p => new[] { new { Type="Parent", p.Id, Parent = (int?)null } } 
     .Concat(p.C1.Select(c => new { Type = "Child1", c.Id, Parent = (int?)p.Id })) 
     .Concat(p.C2.Select(c => new { Type = "Child2", c.Id, Parent = (int?)p.Id }))) 
    .ToList(); 

foreach (var x in allIds) 
    Console.WriteLine("ID:{0} Type:{1} Parent-ID:{2}", x.Id, x.Type, x.Parent?.ToString() ?? "no parent"); 
Verwandte Themen