[C# Lambda] 比對2個List差異 (List內容是多欄位Class)


  1. class GroupedItem
  2. {
  3. public string A { get; set; }
  4. public string B { get; set; }
  5. public int TotalC { get; set; }
  6. }
  7.  
  8. class Program
  9. {
  10. static void Main()
  11. {
  12. List<GroupedItem> list1 = new List<GroupedItem>
  13. {
  14. new GroupedItem { A = "A1", B = "B1", TotalC = 10 },
  15. new GroupedItem { A = "A2", B = "B2", TotalC = 15 },
  16. new GroupedItem { A = "A3", B = "B3", TotalC = 20 }
  17. };
  18.  
  19. List<GroupedItem> list2 = new List<GroupedItem>
  20. {
  21. new GroupedItem { A = "A1", B = "B1", TotalC = 10 },
  22. new GroupedItem { A = "A2", B = "B2", TotalC = 16 },
  23. new GroupedItem { A = "A4", B = "B4", TotalC = 25 }
  24. };
  25.  
  26. var groupedAndSelected1 = list1.GroupBy(item => new { item.A, item.B })
  27. .Select(group => new GroupedItem
  28. {
  29. A = group.Key.A,
  30. B = group.Key.B,
  31. TotalC = group.Sum(item => item.TotalC)
  32. });
  33.  
  34. var groupedAndSelected2 = list2.GroupBy(item => new { item.A, item.B })
  35. .Select(group => new GroupedItem
  36. {
  37. A = group.Key.A,
  38. B = group.Key.B,
  39. TotalC = group.Sum(item => item.TotalC)
  40. });
  41.  
  42. var result = CompareGroupedItems(groupedAndSelected1.ToList(), groupedAndSelected2.ToList());
  43.  
  44. Console.WriteLine("Added items:");
  45. foreach (var item in result.AddedItems)
  46. {
  47. Console.WriteLine($"A={item.A}, B={item.B}, TotalC={item.TotalC}");
  48. }
  49.  
  50. Console.WriteLine("Removed items:");
  51. foreach (var item in result.RemovedItems)
  52. {
  53. Console.WriteLine($"A={item.A}, B={item.B}, TotalC={item.TotalC}");
  54. }
  55. }
  56.  
  57. static (List<GroupedItem> AddedItems, List<GroupedItem> RemovedItems) CompareGroupedItems(List<GroupedItem> list1, List<GroupedItem> list2)
  58. {
  59. var addedItems = list1.Except(list2, new GroupedItemComparer()).ToList();
  60. var removedItems = list2.Except(list1, new GroupedItemComparer()).ToList();
  61.  
  62. return (addedItems, removedItems);
  63. }
  64. }
  65.  
  66. class GroupedItemComparer : IEqualityComparer<GroupedItem>
  67. {
  68. public bool Equals(GroupedItem x, GroupedItem y)
  69. {
  70. if (x == null || y == null)
  71. return false;
  72.  
  73. return x.A == y.A && x.B == y.B && x.TotalC == y.TotalC;
  74. }
  75.  
  76. public int GetHashCode(GroupedItem obj)
  77. {
  78. return (obj.A + obj.B + obj.TotalC).GetHashCode();
  79. }
  80. }



留言

這個網誌中的熱門文章

ORA-12514: TNS: 監聽器目前不知道連線描述區中要求的服務

Oracle 工作排程 DBMS_JOB 筆記

Oracle 例外控制(Exception Control)