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

C#实现列表过滤:移除存在于另外两个列表的元素生成新列表

C# 列表筛选实现:剔除Data3中同时存在于Data1、Data2的邮箱

实现思路

  • 先将JSON结构映射为C#强类型类,方便后续操作
  • 提取Data1、Data2中的邮箱字段,求两个邮箱集合的交集,这部分就是需要从Data3中移除的邮箱
  • 遍历Data3的所有条目,保留邮箱不在上述交集中的条目,提取邮箱字段生成最终字符串列表

完整实现代码

第一步:定义匹配JSON结构的实体类

// 对应每个带邮箱、姓名、备注的用户条目
public class UserEntry
{
    public string comentario { get; set; }
    public string email { get; set; }
    public string name { get; set; }
}

// 对应Data1/Data2/Data3所在的分组
public class UserDataSet
{
    public List<UserEntry> Data1 { get; set; }
    public List<UserEntry> Data2 { get; set; }
    public List<UserEntry> Data3 { get; set; }
}

// 对应event节点
public class EventNode
{
    public List<UserDataSet> userData { get; set; }
}

// 整个JSON的根节点
public class RootObject
{
    // event是C#关键字,前面加@做转义
    public EventNode @event { get; set; }
}

第二步:编写筛选逻辑

这里用C#内置的LINQ语法实现列表操作,写法简洁适合列表处理场景:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;

// 这里替换成你实际的JSON字符串
string jsonText = @"{""event"":{""userData"":[{""Data1"":[{""comentario"":"""",""email"":""erick@gmail.com"",""name"":""erick""},{""comentario"":"""",""email"":""isa@gmail.com"",""name"":""isa""}],""Data2"":[{""comentario"":"""",""email"":""erick@gmail.com"",""name"":""erick""}],""Data3"":[{""comentario"":"""",""email"":""erick@gmail.com"",""name"":""erick""},{""comentario"":"""",""email"":""joseph@gmail.com"",""name"":""joseph""},{""comentario"":"""",""email"":""ju@gmail.com"",""name"":""ju""},{""comentario"":"""",""email"":""isa@gmail.com"",""name"":""isa""}]}]}}";

// 反序列化JSON为C#对象
RootObject root = JsonSerializer.Deserialize<RootObject>(jsonText);
UserDataSet dataSet = root.@event.userData.First();

// 提取Data1和Data2的邮箱交集,作为需要移除的目标邮箱集合
HashSet<string> needRemoveEmails = dataSet.Data1
    .Select(item => item.email)
    .Intersect(dataSet.Data2.Select(item => item.email))
    .ToHashSet();

// 从Data3中筛选符合要求的邮箱,生成最终结果
List<string> newList = dataSet.Data3
    .Where(item => !needRemoveEmails.Contains(item.email))
    .Select(item => item.email)
    .ToList();

// 验证输出,结果为["joseph@gmail.com", "ju@gmail.com"]
foreach (string email in newList)
{
    Console.WriteLine(email);
}

关键点说明

  • LINQ的Select方法用于从对象中提取指定字段,这里用来把用户对象列表转换成纯邮箱字符串列表
  • Intersect方法是LINQ内置的交集计算方法,会返回同时存在于两个序列中的元素,正好匹配「同时在Data1、Data2中存在的邮箱」这个筛选条件
  • 交集结果转HashSet是为了提升存在性判断的效率,HashSet的Contains方法判断速度远快于普通List,数据量较大时优势非常明显
  • 因为event是C#的保留关键字,定义实体类时需要加@前缀做转义,否则会编译报错

如果你使用.NET Framework环境,没有内置System.Text.Json,可以通过NuGet安装Newtonsoft.Json包,反序列化时把JsonSerializer.Deserialize替换成JsonConvert.DeserializeObject即可,其余逻辑完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:18:05