【C#】如何比较两个集合的差异?
场景:在窗口关闭的时候(用户点击叉叉的时候),需要比较用户在当前页面是否有修改,如果有需要提示是否要保存,如果没有才能关闭页面。
解决方案:
已知集合:LstConfig(当前的集合) _localLstConfig(在打开页面随即缓存的初始数据集合)
第一种:集合直接比较
public bool JudgeIsChanged() { if(LstConfig is {Count :var newConfigCount} && _localLstConfig is {Count:var oldConfigCount}) { if(newConfigCount != oldConfigCount){ return true; } else //数量相同比较内容 { var srGroup = LstConfig.Where(x=>!_localLstConfig.Any(o=>x.Name==o.Name && x.IsEnabled==o.IsEnabled)).ToList(); if(srGroup is {Count: >0 }) return true; else return false; } } else return true; }
第二种:集合转成字符文件保存,比较字符文件判断差异
/// <summary> /// 缓存目录 /// </summary> private string _cachePath { get { var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), Path.GetFileName(Assembly.GetEntryAssembly()?.GetName().Name), @"Cache\ConfigJson"); if (!Directory.Exists(path)) Directory.CreateDirectory(path); return path; } } /// <summary> /// 记录配置信息 /// </summary> private void RecordConfig() { if (StorageConfig != null) { var filePath = Path.Combine(_cachePath, "StorageConfig"); if (File.Exists(filePath)) File.Delete(filePath); File.Create(filePath, Encoding.UTF8.GetBytes(StorageConfig.ToJson())); } } /// <summary> /// 读文件 /// </summary> /// <param name="filePath"></param> /// <returns></returns> public string ReadFile(string filePath) { var content = string.Empty; try { if (File.Exists(filePath)) { using var fs = new FileStream(filePath, FileMode.Open); using var sr = new StreamReader(fs); content = sr.ReadToEnd(); } } catch (Exception ex) { Console.WriteLine(ex.Message); } return content; } /// <summary> /// 判断是否更新 /// </summary> /// <returns></returns> public bool IsUpdate() { if (StorageConfig != null) { var filePath = Path.Combine(_cachePath, "StorageConfig"); var oldJson = ReadFile(filePath); var newJson = StorageConfig.ToJson(); return oldJson != newJson; } return false; }
第三种方法json文本比较:
/// <summary> /// 比较数据 /// </summary> /// <param name="collection1"></param> /// <param name="collection2"></param> /// <returns></returns> public bool CompareCollectionsAsJson<T>(IList<T> collection1, IList<T> collection2) { string json1 = JsonSerializer.Serialize(collection1); string json2 = JsonSerializer.Serialize(collection2); // 比较 JSON 字符串 bool areEqual = json1 == json2; return areEqual; }
拷贝方法,用于在初始化数据后随即拷贝一份,最后关闭的时候再比较两者数据:
/// <summary> /// 深拷贝 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="data"></param> /// <returns></returns> public static T DeepCopy<T>(T data) { try { // 使用 JSON 序列化实现深拷贝 string json = JsonSerializer.Serialize(data); if (!string.IsNullOrEmpty(json)) { var copy = JsonSerializer.Deserialize<T>(json); return copy; } } catch (Exception ex) { } return default; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律