Ada beberapa bagian untuk melakukan ini, dengan asumsi setiap daftar tidak mengandung duplikat, Nama adalah pengidentifikasi unik, dan tidak ada daftar yang dipesan.
Pertama buat metode penambahan append untuk mendapatkan satu daftar:
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; }
}
}
Dengan demikian bisa mendapatkan satu daftar:
var oneList = list1.Append(list2);
Kemudian kelompokkan nama
var grouped = oneList.Group(p => p.Name);
Kemudian dapat memproses setiap kelompok dengan helper untuk memproses satu kelompok pada suatu waktu
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);
}
}
Yang dapat diterapkan untuk setiap elemen grouped
:
var finalResult = grouped.Select(g => MergePersonGroup(g));
(Peringatan: tidak diuji.)