Lassen Sie sich einen Schritt hierher zurück. Sie haben zwei Wörterbücher, die Einzelpersonen mit einer Ganzzahl verknüpfen. Sie vergleichen jedoch nicht die Schlüssel der relativen Wörterbücher, sondern deren Werte. Das lässt mich denken, dass die Schlüssel nicht einzigartig sind.
Es klingt wie das, was Sie wollen, dass die vollständige äußere ist beiden Wörterbücher kommen von:
- In Fällen, in denen eine Person in nur File1 vorhanden ist, verwenden Sie den Schlüssel und Wert für die Person von File1.
- Dito für Einzelpersonen nur in File2.
- Fügen Sie die Datensätze zusammen, wenn beide Dateien die gleiche Person (nach Name) enthalten.
Dies kann mit einigen Linq erreicht werden. Verstehe, dass dies nicht die leistungsfähigste der möglichen Lösungen sein wird, aber es ist ein wenig einfacher zu verstehen, was vor sich geht.
//get records from 1 that aren't in 2
var left = _Individuals1.Where(l=>!_Individuals2.Any(r=>l.Value.Name == r.Value.Name));
//get records that appear in both 1 and 2,
//using the select clause to "merge" the data you want from each side
var join = from l in _Individuals1
join r in _Individuals2 on l.Value.Name equals r.Value.Name
select new KeyValuePair<int, Individual>(l.Key, r.Value);
//get records from 2 that aren't in 1
var right = _Individuals2.Where(r=>!_Individuals1.Any(l=>l.Value.Name == r.Value.Name));
//Now, the keys from the left and join enumerables should be consistent,
//because we used the keys from _Individuals1 in both of them.
var merged = left.Concat(join).ToDictionary(x=>x.Key, x=>x.Value);
//BUT, keys from records that only existed in 2 may have duplicate keys,
//so don't trust them
var maxKey = merged.Keys.Max();
foreach(var r in right)
merged.Add(++maxKey, r.Value);
können Sie vermeiden, die „links“ zählbare explizit erstellen, indem Sie die Abfrage Strukturierung, die „join“ erzeugt eine links zu erzeugen verbinden anstelle der inneren Verknüpfung I zeigen. Sie können auch versuchen, Schlüssel von _Individuals2 zu verwenden, indem Sie sie jeweils für das zusammengeführte Verzeichnis überprüfen. Dieser Code würde wie folgt aussehen:
var maxKey = merged.Keys.Max();
foreach(var r in right)
if(merged.ContainsKey(r.Key))
merged.Add(++maxKey, r.Value);
else
{
merged.Add(r.Key, r.Value);
maxKey = r.Key > maxKey ? r.Key : maxKey;
}
Diese sicher Schlüssel von _Individuals2 verwenden, wenn der Schlüssel nicht ein Duplikat sei, so dass einige (aber wahrscheinlich nicht alle) Schlüssel von _Individuals2 verwendet werden sollen. Ob das "besser" ist, hängt von der genauen Situation ab.
Was ist _supposed_, wenn 'name.name' mehrere Treffer hat? –