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
相关产品推荐
相关产品推荐

