Bunu yapmak için, her listenin kopya içermediğini, Ad'ın benzersiz bir tanımlayıcı olduğunu ve her iki listenin de sipariş edilmediğini varsayarak bunu yapmak için birkaç parça vardır.
Tek bir liste almak için önce bir ekleme uzantısı yöntemi oluşturun:
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; }
}
}
Böylece tek bir liste alabilirsiniz:
var oneList = list1.Append(list2);
Sonra isimlendirin
var grouped = oneList.Group(p => p.Name);
Daha sonra her bir grubu bir seferde bir grubu işlemek için bir yardımcı ile işleyebilir
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);
}
}
Hangi her öğeye uygulanabilir grouped
:
var finalResult = grouped.Select(g => MergePersonGroup(g));
(Uyarı: denenmemiş.)