Có một vài phần để làm điều này, giả sử mỗi danh sách không chứa các mục trùng lặp, Tên là một định danh duy nhất và không có danh sách nào được sắp xếp.
Đầu tiên tạo một phương thức mở rộng để thêm một danh sách:
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; }
}
}
Do đó có thể nhận được một danh sách duy nhất:
var oneList = list1.Append(list2);
Sau đó nhóm về tên
var grouped = oneList.Group(p => p.Name);
Sau đó có thể xử lý mỗi nhóm với một người trợ giúp để xử lý một nhóm tại một thời điểm
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);
}
}
Mà có thể được áp dụng cho từng yếu tố của grouped
:
var finalResult = grouped.Select(g => MergePersonGroup(g));
(Cảnh báo: chưa được kiểm tra.)