using System; using System.Collections.Generic; using System.Linq; namespace PCL.Core.Utils.Diff { public class ItemDiff { public static ItemDiffResult ComputeDiff( IEnumerable oldItems, IEnumerable newItems, Func keySelector, IEqualityComparer? keyComparer = null) where TKey : notnull { ArgumentNullException.ThrowIfNull(oldItems); ArgumentNullException.ThrowIfNull(newItems); ArgumentNullException.ThrowIfNull(keySelector); var comparer = keyComparer ?? EqualityComparer.Default; var oldDict = oldItems.ToDictionary(keySelector, comparer); var newDict = newItems.ToDictionary(keySelector, comparer); var oldKeys = new HashSet(oldDict.Keys, comparer); var newKeys = new HashSet(newDict.Keys, comparer); var addedKeys = new HashSet(newKeys.Except(oldKeys, comparer), comparer); var removedKeys = new HashSet(oldKeys.Except(newKeys, comparer), comparer); var commonKeys = new HashSet(oldKeys.Intersect(newKeys, comparer), comparer); var added = addedKeys.Select(k => newDict[k]).ToList(); var removed = removedKeys.Select(k => oldDict[k]).ToList(); var unchanged = commonKeys.Select(k => newDict[k]).ToList(); return new ItemDiffResult(added, removed, unchanged); } } }