You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#如何检测两个列表的顺序变化,同时识别新增和删除的成员

C# 实现两个对象列表的顺序变更检测与增删成员识别

原有代码存在两个核心问题:

  • 提前对两个列表按Number字段排序,会抹除原始列表的排列顺序,无法检测到原列表的顺序变更
  • 仅拼接Name字段做对比,无法区分「顺序变更」「新增元素」「删除元素」三种场景,也无法处理重名的情况

实现思路

以Id作为元素唯一标识,拆分三个检测逻辑:

  • 新增元素:存在于新列表但不存在于旧列表的元素
  • 删除元素:存在于旧列表但不存在于新列表的元素
  • 顺序变更:两个列表的公共元素按原顺序提取的Id序列不一致

完整代码实现

// 首先获取原始列表,不要提前排序,Number>0的过滤逻辑可保留
var newList = GetPref(NewInfo).Where(x => x.Number > 0).ToList();
var oldList = GetPref(OldInfo).Where(x => x.Number > 0).ToList();
StringBuilder note = new StringBuilder();

// 1. 提取新旧列表的Id集合快速判断元素存在性
var oldIds = oldList.Select(x => x.Id).ToHashSet();
var newIds = newList.Select(x => x.Id).ToHashSet();

// 2. 检测并输出新增元素
var addedItems = newList.Where(x => !oldIds.Contains(x.Id)).ToList();
foreach (var item in addedItems)
{
    note.AppendLine($"NewList中{item.Name}已新增");
}

// 3. 检测并输出删除元素
var removedItems = oldList.Where(x => !newIds.Contains(x.Id)).ToList();
foreach (var item in removedItems)
{
    note.AppendLine($"NewList中{item.Name}已移除");
}

// 4. 检测顺序变更:提取公共元素的Id序列对比是否完全一致
var commonOldIds = oldList.Where(x => newIds.Contains(x.Id)).Select(x => x.Id).ToList();
var commonNewIds = newList.Where(x => oldIds.Contains(x.Id)).Select(x => x.Id).ToList();
bool isOrderChanged = !commonOldIds.SequenceEqual(commonNewIds);

if (isOrderChanged)
{
    note.AppendLine("列表排列顺序已发生变更");
    // 如需输出前后顺序可取消注释以下代码
    // note.AppendLine("变更前公共元素顺序:");
    // foreach (var id in commonOldIds)
    // {
    //     note.AppendLine(oldList.First(x => x.Id == id).Name);
    // }
    // note.AppendLine("变更后公共元素顺序:");
    // foreach (var id in commonNewIds)
    // {
    //     note.AppendLine(newList.First(x => x.Id == id).Name);
    // }
}

// 最终输出note.ToString()即可获取所有提示内容

补充说明

  • 如果你的需求中「顺序」是指按Number排序后的顺序,那么可以在获取newList和oldList时保留OrderBy(p => p.Number)的逻辑,其他代码不变
  • 如果需要校验元素属性变更(比如Id相同但Name/Number被修改),可以在公共元素中额外对比属性值输出对应提示

内容的提问来源于stack exchange,提问作者shreyas35

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 09:12:03