2016-12-15 1 views
-3

Ich habe 2 Klassen:Anfügen Klasse zur Liste <Class> Mit Bedingung

public class Person 
{ 
    public string Key {get;set;} 
    public Info Info {get;set;} 
} 

public class Info 
{ 
    public string Key {get;set;} 
    public int ID {get;set;} 
    public string Name {get;set;} 
} 

Ich habe ein List<Person> mit Werten in Key Feld aber Info Feld ist null

ich ein List<Info> mit Werten in alle habe Felder.

Ich möchte jeden Info für seine Person Je nach Key Wert

Wie kann ich dies mit linQ tun zuweisen?

+0

'foreach' Schleife? – Prajwal

+0

"public Info Info {get; set;}" kompiliert es? –

+0

Geben Sie Ihren Code ein, bis Sie es versucht haben. –

Antwort

1

Eine einfache foreach

tun sollten
foreach (var person in people) 
{ 
    person.Info = infos.FirstOrDefault(x => x.Key == person.key); 
} 
1

Konvertieren Sie Ihre Infoliste in eine Suche basierend auf den Schlüsseln zuerst, und durchlaufen Sie dann die Personen, rufen Sie das Infoelement ab und weisen Sie es zu.

var infoLookup = infoList.ToDictionary(i => i.Key); 

foreach (Person p in personList) 
{ 
    Info info; 
    if (infoLookup.TryGetValue(p.Key, out info)) 
     p.Info = info; 
} 

Wir auch infoList.FirstOrDefault() statt es in ein Wörterbuch ersten Umwandlung aber diese Weise nutzen könnten, würden wir eine lineare Suche nach jeder Person hinzufügen. Indem wir es zunächst in ein Dictionary umwandeln, haben wir einen einmaligen linearen Aufwand für die Konvertierung und können dann das Info-Objekt mit konstanter Zeit nachschlagen. Die gesamte zeitliche Komplexität ist also nur linear (da wir immer noch alle Personen durchlaufen müssen).

0
foreach(var person in myPersonList) 
{ 
    item.Info = myInfoPerson.Where(o => o.key == person.key).FirstOrDefault(); 
} 
+1

Sie können 'Where' direkt mit' FirstOrDefault' ersetzen;) –

+0

Bitte fügen Sie der Antwort einige Informationen hinzu und erklären Sie, was es macht oder wie es funktioniert. –

-1

eine Join-Abfrage verwenden:

Beispieldaten

List<Person> persons = new List<Person>() 
{ 
    new Person() { Key = "key1" }, 
    new Person() { Key = "key2" }, 
}; 

List<Info> infos = new List<Info>() 
{ 
    new Info() { Key="key1", Name="name1", ID=1 }, 
    new Info() { Key="key1", Name="name2", ID=2 }, 
    new Info() { Key="key2", Name="name3", ID=1 } 
}; 

query:

var joinQuery = from c in persons 
       join info in infos on c.Key equals info.Key 
       select new Person { Key = c.Key, Info = info }; 
+1

Dies erstellt jedoch neue Person-Objekte.Und es verbirgt auch die Komplexität, dass es immer noch die Informationsliste für jede einzelne Person durchläuft (wodurch es eine quadratische Zeitkomplexität hat). – poke

+1

@poke Sie sind richtig für den ersten Teil, aber nicht für die quadratische Zeitkomplexität, da '' Join' 'Hash-basiertes Lookup wie in Ihrer Lösung verwendet. –

+0

@IvanStoev Oh ja, du hast Recht. Ich habe vergessen, dass Enumerable.Join eine Suche erstellen würde. – poke

-2

Dies funktioniert.

info.ForEach(x => { person.FirstOrDefault(y => y.Key == x.Key).Info = x; });

Verwandte Themen