using System.Collections.Generic; using System.Linq; public static class GoogleSheetComparer { public static GoogleSheetDiffResult Compare(List oldList, List newList) where T : class { var result = new GoogleSheetDiffResult(); var oldDict = oldList.ToDictionary(x => GetId(x)); var newDict = newList.ToDictionary(x => GetId(x)); foreach (var newId in newDict.Keys) { if (!oldDict.ContainsKey(newId)) result.Added.Add(newId); else if (!IsSame(oldDict[newId], newDict[newId])) result.Modified.Add(newId); } foreach (var oldId in oldDict.Keys) { if (!newDict.ContainsKey(oldId)) result.Removed.Add(oldId); } return result; } private static string GetId(object obj) { var field = obj.GetType().GetField("Id"); return field?.GetValue(obj)?.ToString() ?? ""; } private static bool IsSame(object a, object b) { foreach (var field in a.GetType().GetFields()) { var valA = field.GetValue(a); var valB = field.GetValue(b); if (!Equals(valA, valB)) return false; } return true; } }