using System.Collections.Generic;
public int Id { get; set; }
public int Weight { get; set; }
public int Phase { get; set; }
public class ItemComparison
public int Id { get; init; }
public string Weight => GetComparisonString(_weightPrevious, _weightCurrent);
public string Phase => GetComparisonString(_phasePrevious, _phaseCurrent);
public ItemComparison(Item previousItem, Item currentItem)
Id = (previousItem ?? currentItem).Id;
_weightPrevious = previousItem?.Weight;
_weightCurrent = currentItem?.Weight;
_phasePrevious = previousItem?.Phase;
_phaseCurrent = currentItem?.Phase;
private int? _weightPrevious;
private int? _weightCurrent;
private int? _phasePrevious;
private int? _phaseCurrent;
private string GetComparisonString(int? previousValue, int? currentValue)
if (previousValue == currentValue)
return $"{GetStringOrUnknown(previousValue)} --> {GetStringOrUnknown(currentValue)}";
private string GetStringOrUnknown(int? value)
return value.HasValue ? value.ToString() : "?";
public static void Main()
List<Item> queryResult1 = new()
new() { Id = 1, Weight = 123, Phase = 1 },
new() { Id = 2, Weight = 55, Phase = 1 },
new() { Id = 3, Weight = 122, Phase = 2 },
new() { Id = 4, Weight = 7, Phase = 2 },
List<Item> queryResult2 = new()
new() { Id = 1, Weight = 123, Phase = 1 },
new() { Id = 4, Weight = 7, Phase = 1 },
new() { Id = 5, Weight = 122, Phase = 2 },
var updatedItems = queryResult1
(previous, current) => new ItemComparison(previous, current));
var removedItems = queryResult1
.ExceptBy(queryResult2.Select(qr2 => qr2.Id), qr1 => qr1.Id)
.Select(removed => new ItemComparison(removed, null));
var addedItems = queryResult2
.ExceptBy(queryResult1.Select(qr1 => qr1.Id), qr2 => qr2.Id)
.Select(added => new ItemComparison(null, added));
List<ItemComparison> comparisonResult = updatedItems
.OrderBy(item => item.Id)
Console.WriteLine($"{nameof(ItemComparison.Id)} {nameof(ItemComparison.Weight)} {nameof(ItemComparison.Phase)}");
Console.WriteLine("----------------------------------");
foreach (var comparison in comparisonResult)
Console.WriteLine($"{comparison.Id} {comparison.Weight} {comparison.Phase}");