如何使用C# Lambda拆分字符串并查询指定员工ID的薪资ID
用C# Lambda表达式快速获取指定员工ID的薪资ID
当然可以!相比手动遍历数组的方式,用C#的LINQ结合Lambda表达式能更优雅、简洁地完成这个需求,还能兼顾代码的健壮性。下面给你两种常用的实现方式:
方式一:单次查询的简洁实现
如果只是偶尔查询一次员工ID,直接链式调用LINQ方法就能搞定,不需要额外存储映射关系:
string mystring = "0:12211,90:33221,23:09011"; int targetEmployeeId = 23; // 通过Lambda + LINQ直接查询 var salaryId = mystring.Split(',') .Select(item => item.Split(':')) // 过滤格式合法且匹配目标员工ID的条目 .Where(parts => parts.Length == 2 && int.TryParse(parts[0], out int empId) && empId == targetEmployeeId) .Select(parts => parts[1]) // 取第一个匹配结果,没找到则返回null .FirstOrDefault(); if (salaryId != null) { Console.WriteLine($"员工ID {targetEmployeeId} 对应的薪资ID是:{salaryId}"); } else { Console.WriteLine($"未找到员工ID {targetEmployeeId} 的薪资信息"); }
这段代码的逻辑很清晰:
- 先用
Split(',')把原始字符串拆分成单个员工的薪资条目 - 再用
Select把每个条目拆分成员工ID和薪资ID的数组 - 通过
Where过滤掉格式错误(比如没有冒号、员工ID不是数字)的条目,只保留匹配目标ID的项 - 最后提取薪资ID,用
FirstOrDefault确保没找到时返回null,避免抛出异常
方式二:预存映射,适合多次查询
如果需要频繁查询不同员工的薪资ID,建议先把字符串转换成Dictionary<int, string>,这样后续查询的效率会更高(O(1)时间复杂度):
string mystring = "0:12211,90:33221,23:09011"; // 提前构建员工ID到薪资ID的映射字典 var employeeSalaryMap = mystring.Split(',') .Select(item => item.Split(':')) .Where(parts => parts.Length == 2 && int.TryParse(parts[0], out _)) .ToDictionary(parts => int.Parse(parts[0]), parts => parts[1]); // 查询指定员工ID int targetEmployeeId = 23; if (employeeSalaryMap.TryGetValue(targetEmployeeId, out string foundSalaryId)) { Console.WriteLine($"员工ID {targetEmployeeId} 对应的薪资ID是:{foundSalaryId}"); } else { Console.WriteLine($"未找到员工ID {targetEmployeeId} 的薪资信息"); }
这种方式的优势在于,映射只需要构建一次,后续不管查询多少次都能快速获取结果,非常适合需要多次查询的场景。
额外提示
上面的代码都加入了格式校验逻辑(比如检查parts.Length == 2、用int.TryParse验证员工ID),能避免原始字符串格式不规范时出现异常,让程序更稳定。
内容的提问来源于stack exchange,提问作者VAAA
相关产品推荐
相关产品推荐

