각 목록에 중복 항목이없고 이름이 고유 식별자이고 목록이 정렬되지 않았다고 가정하면이 작업에는 몇 가지가 있습니다.
먼저 추가 확장 메소드를 작성하여 단일 목록을 가져 오십시오.
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; }
}
}
따라서 단일 목록을 얻을 수 있습니다.
var oneList = list1.Append(list2);
그런 다음 이름으로 그룹화하십시오.
var grouped = oneList.Group(p => p.Name);
그런 다음 도우미로 각 그룹을 처리하여 한 번에 하나의 그룹을 처리 할 수 있습니다.
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);
}
}
다음의 각 요소에 적용 할 수 있습니다 grouped
.
var finalResult = grouped.Select(g => MergePersonGroup(g));
(경고 : 테스트되지 않았습니다.)