Вы используете .NET 3.5? Я уверен, что LINQ to Objects сделает многое из этого намного проще.
Еще одна вещь, о которой стоит подумать, это то, что если у вас много кода с общим шаблоном, где меняется только несколько вещей (например, «какое свойство я сравниваю?»), То это хороший кандидат на использование универсального метода делегат, представляющий эту разницу.
РЕДАКТИРОВАТЬ: Хорошо, теперь мы знаем, что мы можем использовать LINQ:
Шаг 1. Сокращение вложенности
Во-первых, я бы выбрал один уровень вложенности. Вместо:
if (NewStep.Id != Guid.Empty && SavedStep.Id != Guid.Empty)
{
// Body
}
Я бы сделал:
if (NewStep.Id != Guid.Empty && SavedStep.Id != Guid.Empty)
{
return;
}
// Body
Раннее возвращение, подобное этому, может сделать код намного более читабельным.
Шаг 2. Поиск документов для удаления
Было бы намного лучше, если бы вы могли просто указать ключевую функцию для Enumerable.Intersect. Вы можете указать средство сравнения на равенство, но его создание затруднительно даже при использовании служебной библиотеки. Ах, хорошо.
var oldDocIds = OldDocs.Select(doc => doc.DocId);
var newDocIds = NewDocs.Select(doc => doc.DocId);
var deletedIds = oldDocIds.Intersect(newDocIds).ToDictionary(x => x);
var deletedDocs = oldDocIds.Where(doc => deletedIds.Contains(doc.DocId));
Шаг 3: Извлечение документов
Либо используйте существующий цикл foreach, либо измените свойства. Если ваши свойства на самом деле имеют тип List , тогда вы можете использовать RemoveAll.
Шаг 4. Обновление и удаление пользователей
foreach (StepUser deleted in usersToDelete)
{
// Should use SingleOfDefault here if there should only be one
// matching entry in each of NewUsers/OldUsers. The
// code below matches your existing loop.
StepUser oldUser = OldUsers.LastOrDefault(u => u.UserId == deleted.UserId);
StepUser newUser = NewUsers.LastOrDefault(u => u.UserId == deleted.UserId);
// Existing code here using oldUser and newUser
}
Один вариант еще более упростить процесс - реализовать IEqualityComparer с использованием UserId (и один для документов с DocId).