Comparer deux listes d'objets pour nouveaux, modifiés, mis à jour sur une propriété spécifique

J'ai essayer et de ne pas pour un certain temps pour trouver une solution à comparer à la liste des objets en se basant sur une propriété des objets. J'ai lu d'autres solutions similaires, mais ils n'étaient pas adaptés (ou je n'ai pas compris la réponse!).

Code C#

J'ai un modèle qui représente une image

public class AccommodationImageModel
{
    public int Id { get; set; }
    public string Path { get; set; }
    public string Caption { get; set; }
    public string Description { get; set; }
    public bool CoverImage { get; set; }
    public bool Visible { get; set; }     
}

J'ai deux listes de ce modèle. L'une est la liste existante, l'autre est une liste à jour. J'ai besoin de comparer les deux listes pour voir qui ont été supprimés, mis à jour ou sont nouveaux.

Je n'ai pas besoin de comparer l'ensemble de l'objet, il suffit de comparer entre eux sur leur propriété Id.

List<AccommodationImageModel> masterList;
List<AccommodationImageModel> compareList;

Nouveau

Si compareList contient tout AccommodationImageModel avec un Id=0 alors qu'ils sont nouveaux, car les nouvelles entrées ne disposez pas d'un Id affecté encore.

Être supprimé

Si masterList contient tout AccommodationImageModel avec des Identifiants qui ne sont Pas dans compareList ensuite, ils doivent être supprimés, parce qu'ils ont été retirés de la compareList et devrait être retiré de la masterList. Donc j'ai besoin d'une liste de celles qui doivent être supprimées.

Être mis à jour

Si newList et masterList avoir les Id qui sont les mêmes, alors ils doivent être mis à jour. Donc j'ai besoin d'une liste de ceux qui partagent le même ID, donc je ne peux les mettre à jour. Je ne suis pas trop inquiet si ces modèles sont identiques et n'ont pas besoin de mise à jour car il n'y aura qu'un petit nombre par liste de sorte qu'il n'a pas beaucoup d'importance si ils me mis à jour, même si ils n'ont pas changé.

Chacun des trois résultats doit être retourné comme une Liste de AccommodationImageModel afin que je puisse procéder à la mise à jour appropriée, supprimer, ajouter.

Modifier

J'ai ajouté 3 méthodes d'essai ci-dessous avec ma solution choisie à partir d'un guichet automatique, en montrant son travail de mise en œuvre.

Méthodes d'essai

[TestMethod]
public void Test_Deleted_Image()
{
//set up the masterList
List<AccommodationImageModel> masterList = new List<AccommodationImageModel>();
masterList.Add(new AccommodationImageModel { Id = 1 });
masterList.Add(new AccommodationImageModel { Id = 2 });
//set up the compare list
List<AccommodationImageModel> compareList = new List<AccommodationImageModel>();
compareList.Add(new AccommodationImageModel { Id = 1 });
compareList.Add(new AccommodationImageModel { Id = 3 });
compareList.Add(new AccommodationImageModel { Id = 0 });
//get the deleted models
List<AccommodationImageModel> result = masterList.Where(c => !compareList.Any(d => d.Id == c.Id)).ToList();
//result should hold first model with id 2
Assert.AreEqual(2, result.FirstOrDefault().Id);
}
[TestMethod]
public void Test_Added_Image()
{
//set up the masterList
List<AccommodationImageModel> masterList = new List<AccommodationImageModel>();
masterList.Add(new AccommodationImageModel { Id = 1 });
masterList.Add(new AccommodationImageModel { Id = 2 });
//set up the compare list
List<AccommodationImageModel> compareList = new List<AccommodationImageModel>();
compareList.Add(new AccommodationImageModel { Id = 1 });
compareList.Add(new AccommodationImageModel { Id = 3 });
compareList.Add(new AccommodationImageModel { Id = 0 });
//get the added models
List<AccommodationImageModel> result = compareList.Where(c => c.Id == 0).ToList();
//result should hold first model with id 0
Assert.AreEqual(0, result.FirstOrDefault().Id);
}
[TestMethod]
public void Test_Updated_Image()
{
//set up the masterList
List<AccommodationImageModel> masterList = new List<AccommodationImageModel>();
masterList.Add(new AccommodationImageModel { Id = 1 });
masterList.Add(new AccommodationImageModel { Id = 2 });
//set up the compare list
List<AccommodationImageModel> compareList = new List<AccommodationImageModel>();
compareList.Add(new AccommodationImageModel { Id = 1 });
compareList.Add(new AccommodationImageModel { Id = 3 });
compareList.Add(new AccommodationImageModel { Id = 0 });
//get the updated models
List<AccommodationImageModel> result = masterList.Where(c => compareList.Any(d => c.Id == d.Id)).ToList();
//result should hold first model with id 1
Assert.AreEqual(1, result.FirstOrDefault().Id);
}

source d'informationauteur user3313496