Я пытался и не смог найти решение для сравнения с списками объектов на основе свойств объектов. Я читал другие подобные решения, но они либо не были подходящими (или я не понял ответа!).
Код - С#
У меня есть модель, представляющая изображение
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; }
}
У меня есть два списка этой модели. Один из них - это существующий список, другой - обновленный список. Мне нужно сравнить два списка, чтобы увидеть, какие из них были удалены, обновлены или новые.
Мне не нужно сравнивать весь объект, просто сравните их с их идентификатором свойства.
List<AccommodationImageModel> masterList;
List<AccommodationImageModel> compareList;
New
Если compareList содержит любой объект AccommodationImageModel с Id = 0, то они новы, потому что новые записи еще не имеют назначенного идентификатора.
Будет удалено
Если masterList содержит любой объект AccommodationImageModel с идентификаторами, которые не указаны в compareList, они должны быть удалены, поскольку они были удалены из списка сравнения и должны быть удалены из masterList. Поэтому мне нужен список тех, которые нужно удалить.
Для обновления
Если newList и masterList имеют одинаковые идентификаторы, они должны быть обновлены. Поэтому мне нужен список тех, которые имеют один и тот же идентификатор, поэтому я могу их обновить. Я не слишком обеспокоен тем, что эти модели идентичны и не нуждаются в обновлении, так как в списке будет только небольшое число, поэтому это не имеет большого значения, если они обновляются, даже если они не изменились.
Каждый из трех результатов должен быть возвращен как List of AccommodationImageModel, чтобы затем я мог выполнить соответствующее обновление, удалить, добавить.
Изменить
Я добавил три метода тестирования с моим выбранным решением из ATM, показывая его рабочую реализацию.
Методы тестирования
[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);
}