Il y a quelques éléments à prendre en compte, en supposant que chaque liste ne contient pas de doublons, que le nom est un identifiant unique et qu'aucune des listes n'est ordonnée.
Créez d'abord une méthode d'extension append pour obtenir une liste unique :
static class Ext {
public static IEnumerable<T> Append(this IEnumerable<T> source,
IEnumerable<T> second) {
foreach (T t in source) { yield return t; }
foreach (T t in second) { yield return t; }
}
}
On peut ainsi obtenir une liste unique :
var oneList = list1.Append(list2);
Puis groupe sur le nom
var grouped = oneList.Group(p => p.Name);
Ensuite, on peut traiter chaque groupe avec une aide pour traiter un groupe à la fois.
public Person MergePersonGroup(IGrouping<string, Person> pGroup) {
var l = pGroup.ToList(); // Avoid multiple enumeration.
var first = l.First();
var result = new Person {
Name = first.Name,
Value = first.Value
};
if (l.Count() == 1) {
return result;
} else if (l.Count() == 2) {
result.Change = first.Value - l.Last().Value;
return result;
} else {
throw new ApplicationException("Too many " + result.Name);
}
}
qui peut être appliqué à chaque élément de grouped
:
var finalResult = grouped.Select(g => MergePersonGroup(g));
(Attention : non testé.)