如何检测对象列表中指定名称缺失的OBJ ID值?
问题描述
我有两个对象列表:
- 第一个是Employee列表,数据如下:
| ID | NAME |
|---|---|
| 1 | CAT |
| 2 | DOG |
- 第二个是company列表,数据如下:
| Name | OBJ ID |
|---|---|
| CAT | 500 |
| DOG | 500 |
| CAT | 600 |
| DOG | 600 |
| DOG | 700 |
注:第二个列表中的OBJ ID共有500、600、700三个值。
需求:找出第二个列表中CAT缺失的OBJ ID值700(DOG包含全部三个OBJ ID,而CAT仅包含500、600)。
原C#代码(需修正)
List<Employee> e1 = new List<Employee>(); e1.Add(new Employee { Name = "CAT" }); e1.Add(new Employee { Name = "DOG" }); List<company> c1 = new List<company>(); c1.Add(new company { objid="1", cname = "CAT", id = "500" }); c1.Add(new company { objid = "2", cname = "DOG", id = "500"}); c1.Add(new company { objid = "3", cname = "CAT", id = "600" }); c1.Add(new company { objid = "4", cname = "DOG", id = "600" }); c1.Add(new company { objid = "5", cname = "DOG", id = "700" }); var QSOuterJoin = from emp in e1 join add in c1 on emp.Name equals add.cname into EmployeeNameGroup from address in EmployeeNameGroup.DefaultIfEmpty() select new { emp, address }; List<int> uniqlist = new List<int>(); uniqlist.Add(500); uniqlist.Add(600); uniqlist.Add(700); foreach (var i in QSOuterJoin) { foreach (var j in uniqlist) { if (String.IsNullOrEmpty(i.address?.id)) { Console.WriteLine("{0} is not {1} {2}", i.emp.Name, i.address?.id, j); } } }
修正后的C#代码
// 补充实体类定义(原代码遗漏部分) public class Employee { public string Name { get; set; } } public class company { public string objid { get; set; } public string cname { get; set; } public string id { get; set; } } class Program { static void Main() { List<Employee> e1 = new List<Employee>(); e1.Add(new Employee { Name = "CAT" }); e1.Add(new Employee { Name = "DOG" }); List<company> c1 = new List<company>(); c1.Add(new company { objid="1", cname = "CAT", id = "500" }); c1.Add(new company { objid = "2", cname = "DOG", id = "500"}); c1.Add(new company { objid = "3", cname = "CAT", id = "600" }); c1.Add(new company { objid = "4", cname = "DOG", id = "600" }); c1.Add(new company { objid = "5", cname = "DOG", id = "700" }); // 从company列表动态提取所有唯一OBJ ID,避免硬编码 var allObjIds = c1.Select(item => item.id).Distinct().ToList(); foreach (var emp in e1) { // 获取当前员工已关联的所有OBJ ID var empOwnedObjIds = c1.Where(item => item.cname == emp.Name) .Select(item => item.id) .ToList(); // 计算缺失的OBJ ID var missingObjIds = allObjIds.Except(empOwnedObjIds); foreach (var missingId in missingObjIds) { Console.WriteLine($"员工{emp.Name}缺失的OBJ ID:{missingId}"); } } } }
代码说明
- 动态提取所有唯一OBJ ID:不再手动创建
uniqlist,直接从company列表中提取,后续数据更新时无需手动维护。 - 对比员工已关联的ID:遍历每个员工,筛选出该员工在
company列表中对应的所有OBJ ID。 - 找出缺失ID:使用
Except方法计算所有全局OBJ ID与员工已关联ID的差集,得到缺失的ID。 - 运行结果:会输出
员工CAT缺失的OBJ ID:700,完全符合需求。
内容的提问来源于stack exchange,提问作者Pranesh Sankpal
相关产品推荐
相关产品推荐

