J'ai une classe qui compare 2 instances des mêmes objets et génère une liste de leurs différences. Ceci est fait en faisant une boucle dans les collections de clés et en remplissant un ensemble d'autres collections avec une liste de ce qui a changé (cela peut sembler plus logique après avoir vu le code ci-dessous). Cela fonctionne, et génère un objet qui me permet de savoir exactement ce qui a été ajouté et enlevé entre "l'ancien" objet et le "nouveau".
Ma question/préoccupation est-ce ... c'est vraiment moche, avec des tonnes de boucles et de conditions. Y a-t-il une meilleure façon de stocker/d'approcher cela, sans avoir à compter si fortement sur des groupes interminables de conditions codées en dur?Suppression de boucles répétitives codées en dur et de conditions dans C#
public void DiffSteps()
{
try
{
//Confirm that there are 2 populated objects to compare
if (NewStep.Id != Guid.Empty && SavedStep.Id != Guid.Empty)
{
//<TODO> Find a good way to compare quickly if the objects are exactly the same...hash?
//Compare the StepDoc collections:
OldDocs = SavedStep.StepDocs;
NewDocs = NewStep.StepDocs;
Collection<StepDoc> docstoDelete = new Collection<StepDoc>();
foreach (StepDoc oldDoc in OldDocs)
{
bool delete = false;
foreach (StepDoc newDoc in NewDocs)
{
if (newDoc.DocId == oldDoc.DocId)
{
delete = true;
}
}
if (delete)
docstoDelete.Add(oldDoc);
}
foreach (StepDoc doc in docstoDelete)
{
OldDocs.Remove(doc);
NewDocs.Remove(doc);
}
//Same loop(s) for StepUsers...omitted for brevity
//This is a collection of users to delete; it is the collection
//of users that has not changed. So, this collection also needs to be checked
//to see if the permisssions (or any other future properties) have changed.
foreach (StepUser user in userstoDelete)
{
//Compare the two
StepUser oldUser = null;
StepUser newUser = null;
foreach(StepUser oldie in OldUsers)
{
if (user.UserId == oldie.UserId)
oldUser = oldie;
}
foreach (StepUser newie in NewUsers)
{
if (user.UserId == newie.UserId)
newUser = newie;
}
if(oldUser != null && newUser != null)
{
if (oldUser.Role != newUser.Role)
UpdatedRoles.Add(newUser.Name, newUser.Role);
}
OldUsers.Remove(user);
NewUsers.Remove(user);
}
}
}
catch(Exception ex)
{
string errorMessage =
String.Format("Error generating diff between Step objects {0} and {1}", NewStep.Id, SavedStep.Id);
log.Error(errorMessage,ex);
throw;
}
}
Le cadre ciblé est de 3,5.
Le cadre ciblé est de 3,5. – Dan