Для этого есть несколько частей, если каждый список не содержит дубликатов, имя является уникальным идентификатором, и ни один список не упорядочен.
Сначала нужно создать метод расширения Append, чтобы получить единый список:
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));
(Предупреждение:. Непроверенные)
Действительно ли linq действительно нужен - хороший foreach с небольшим количеством выражений linq-ish может также работать. – Rashack
Добавляем этот комментарий как версию названия вопроса, и фактический вопрос не соответствует: реальный ответ на этот вопрос - [этот ответ от Майка] (http://stackoverflow.com/a/6772832/1542187). Большинство других ответов, хотя и полезно, фактически не решают проблему, представленную оригинальным плакатом. –