2016-05-25 5 views
-1

Ich habe folgende ObjekteC# wählen Werte einer Eigenschaft aus einer Liste in einer Liste

class A 
{ 
    public List<B> listB { get; set; } 
} 

class B 
{ 
    public int id { get; set; } 
} 

und in meiner Anwendung habe ich ein Szenario wie unten ..

public void main() 
{  
    var lstA = new List<A>(); 

    var lstA = new List<A>(); 

    var a1 = new A(); 
    a1.listB = new List<B> 
    { 
     new B() { id = 1 }, 
     new B() { id = 2 } 
    }; 
    lstA.Add(a1); 

    a1 = new A(); 
    a1.listB = new List<B> 
    { 
     new B() { id = 3 }, 
     new B() { id = 4 } 
    }; 
    lstA.Add(a1); 
} 

Und ich brauche zu wählen alle IDs von B Objekte aus LSTA

Hier ist, was ich bisher ausprobiert habe

var ids = lst.Select(x=>x.listB.Select(y=>y.id)).ToList(); 

Aber es gibt mir einen Kompilierungsfehler.

Wie kann ich das tun?

Antwort

3

Sie sind fast da, verwenden SelectMany

var ids = lst.SelectMany(x=>x.listB.Select(y=>y.id)).ToList(); 

Überprüfen Sie Ihre Working Code

+3

Warum nach unten Stimme hier ab? Bitte kommentieren. –

+3

Wer die Abstimmung ablehnt, ohne einen Kommentar abzugeben, wird niemandem helfen, bitte kommentieren. Wir können die Antwort immer verbessern. –

4

Sie haben SelectMany zu verwenden, welche die Listen flacht:

var ids = lst.SelectMany(x => x.listB.Select(y => y.id)).ToList(); 
1

Hier ist, was ich tat, und es funktioniert perfekt
Alles, was ich getan habe war, die Klassen öffentlich zu machen und wenn Sie 012 initialisieren, Sie new List<B> hinzufügen, denn obwohl intellisense Sie keine Fehler nicht zeigt, wenn Sie die Anwendung ausführen, können Sie nicht referenziert Fehler

class Program 
{ 
    static void Main(string[] args) 
    { 
     var lstA = new List<A>(); 

     var a1 = new A() 
     { 
      listB = new List<B>() 
      { 
       new B 
       { 
        id = 3 
       }, 
       new B 
       { 
        id = 5 
       } 
      } 
     }; 
     var a2 = new A() 
     { 
      listB = new List<B>() 
      { 
       new B 
       { 
        id = 1 
       }, 
       new B 
       { 
        id = 8 
       } 
      } 
     }; 

     lstA.Add(a1); 
     lstA.Add(a2); 
     var ids = lstA.SelectMany(r => r.listB.Select(x => x.id)); 
     foreach (var id in ids) 
     { 
      Console.WriteLine(id); 
     } 
     Console.ReadKey(); 

    } 
} 

public class A 
{ 
    public List<B> listB { get; set; } 

} 

public class B 
{ 
    public int id { get; set; } 
} 
+0

Das Problem hat nichts damit zu tun, dass die Klassen "öffentlich" oder anders sind. Wie auch immer, Sie erwähnen dasselbe wie Hari und ich haben auch in unseren Antworten vorgeschlagen, 'SelectMany' anstelle von' Select' zu verwenden. Dies löst das Problem. – HimBromBeere

0

versuchen, diese doppelte ID zu ignorieren Objekt erhalten

var ids = lstA.SelectMany(x => x.listB.Select(y => y.id)).Distinct().ToList(); 
Verwandte Themen