2012-04-03 19 views
2

Ich habe eine Liste von Objekten und in jedem Objekt enthalten sie eine Liste von IDs.So rufen Sie eine Liste bestimmter Werte aus einer Liste in einer Liste ab

Der folgende Code erstellt eine Liste von 10 Mitgliedern und erstellt dann eine Liste von fünf zufälligen IDs in jedem Mitglied.

public class Member 
{ 
    List<int> Ids { get; set; } 

    public Member() 
    { 
     Ids = new List<int>(); 
    } 
} 

var rnd = new Random(); 
var container = new List<Member>(); 

// Add members with random Ids 
for (int i = 1; i <= 10; i++){ 
    var member = new Member(); 

    for (int j = 1; j <= 5; j++){ 
     member.Ids.Add(rnd.Next(100)); 
    } 
} 

var distinctIds = ?????; 

Was mit ich bin zu kämpfen ist die LINQ eine eindeutige Liste der Ids für alle Mitglieder abzurufen.

+0

Nur ein Hinweis, Sie erstellen nur 9 Mitglieder und 4 Ids. Nicht, dass es für deine Frage wichtig ist :) – Alex

+0

Valid :) Ich habe meinen Demo-Code geändert –

+0

Du erhältst möglicherweise doppelte Werte in deiner 'for'-Schleife, die zufällige IDs zuweist. Das Aufrufen von 'rnd.Next()' in einer engen Schleife kann zu Duplikaten führen (nicht sicher, ob das für Sie in Ordnung ist, aber ich dachte, ich würde darauf hinweisen). –

Antwort

1
var distinctIds = 
    (from member in container 
    from id in member.Ids 
    select id).Distinct(); 

natürlich Es ist die Methode-y-Syntax, die in diesem Fall würden SelectMany werden:

var distinctIds = container.SelectMany(member => member.Ids).Distinct(); 

aber ich kann nie daran erinnern, wie es zu nennen, so dass ich lieber im Allgemeinen mehrere from s.

+0

Sie können auch ein IEqualityComparer-Objekt übergeben, um zu entscheiden, wie dieser Typ als distinct bezeichnet werden soll. Bei Integers/Strings ist der Standardwert jedoch ausreichend. –

Verwandte Themen