staticvoidTest3() { var original = new List<User>() { new User{ Id = "A01", Name = "Jeffrey" }, new User{ Id = "A02", Name = "Darkthread" } }; var originalJson = JsonConvert.SerializeObject(original);
var merged = new List<User>(); merged.AddRange(original); merged.Add(new User { Id = "B01", Name = "Ironman" }); var mergedJson = JsonConvert.SerializeObject(merged);
//模擬情境 //original 由資料庫欄位 JSON 還原 //merged 由 WebAPI Request 傳入 JSON 還原 var fromDb = JsonConvert.DeserializeObject<List<User>>(originalJson); var fromReq = JsonConvert.DeserializeObject<List<User>>(mergedJson);
var diff = fromReq.Except(fromDb, new UserComparer()); Console.WriteLine(JsonConvert.SerializeObject(diff)); }
這樣 Except 就能按照 Id 判斷,得到正確的差異結果。
解法 2 IEquatable 與覆寫 Equals()、GetHashCode()
另一種方式是,直接在 User 類別上宣告「我的相等性定義」,實作 IEquatable,並覆寫 Equals() 與 GetHashCode()。
publicoverrideboolEquals(object obj) => Equals(obj as User); publicoverrideintGetHashCode() => Id.GetHashCode(); } staticvoidTest4() { var original = new List<User>() { new User{ Id = "A01", Name = "Jeffrey" }, new User{ Id = "A02", Name = "Darkthread" } }; var originalJson = JsonConvert.SerializeObject(original);
var merged = new List<User>(); merged.AddRange(original); merged.Add(new User { Id = "B01", Name = "Ironman" }); var mergedJson = JsonConvert.SerializeObject(merged);
//模擬情境 //original 由資料庫欄位 JSON 還原 //merged 由 WebAPI Request 傳入 JSON 還原 var fromDb = JsonConvert.DeserializeObject<List<User>>(originalJson); var fromReq = JsonConvert.DeserializeObject<List<User>>(mergedJson);
var diff = fromReq.Except(fromDb); Console.WriteLine(JsonConvert.SerializeObject(diff)); }
publicstatic Dictionary<string,List<string>> parseTeritory(string input) { var finalDicts = new Dictionary<string,List<string>>(); var lines = input.Replace("\r","").Split("\n"); foreach(var line in lines) { var leaderRegionsParis = line.Split(":"); //// 全形符號啦! var leader = leaderRegionsParis[0]; var regions = leaderRegionsParis.Last().Split("、").ToList(); if(finalDicts.TryAdd(leader,regions) == false) { finalDicts.Add(leader,regions); } } return finalDicts; }