【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;
}
复制代码

 

posted @   春天花会开,  阅读(62)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示