如何在C# Dictionary中校验用户与服务绑定的重复值以符合业务规则
正确实现方案
你需求里唯一的禁止规则是同一用户不能重复绑定同一个服务,其余场景均为合法,原有代码冗余多、逻辑偏离需求,可直接按如下逻辑实现:
// 收集所有有效的用户ID var validUserIds = new List<string> { data.jMBG, data.secondPersonJMBG, data.thirdPersonJMBG, data.fourthPersonJMBG, data.fifthPersonJMBG }.Where(x => !string.IsNullOrEmpty(x)).ToList(); // 构造<用户ID,服务ID>的绑定对列表 var bindingPairs = new List<(string UserId, int ServiceId)>(); if (data?.Schedules != null) { // 取用户数和排班数的较小值遍历,避免索引越界 var maxLoopCount = Math.Min(validUserIds.Count, data.Schedules.Count); for (int i = 0; i < maxLoopCount; i++) { var service = data.Schedules[i]?.Service; if (service != null && service.Id > 0) { bindingPairs.Add((validUserIds[i], service.Id)); } } } // 核心校验:判断是否存在同一用户绑定同一服务多次的情况 bool isInvalid = bindingPairs .GroupBy(x => new { x.UserId, x.ServiceId }) .Any(group => group.Count() > 1); if (isInvalid) { // 提示存在同一用户重复绑定同服务,无法继续 } else { // 校验通过,继续流程 }
逻辑说明
上述实现完全匹配你给出的4条业务规则:
- 不同用户绑定不同服务:分组后每组仅1条数据,判定合法
- 不同用户绑定相同服务:分组的用户ID不同,属于不同分组,每组仅1条数据,判定合法
- 同一用户绑定相同服务:分组的用户ID和服务ID完全一致,组内条数大于1,判定非法
- 同一用户绑定不同服务:分组的服务ID不同,属于不同分组,每组仅1条数据,判定合法
同时规避了原有代码的问题:无需给用户ID加前缀、不需要多余的多用户同服务校验、避免了两个列表Zip合并时长度不一致导致的对应错位问题。
内容的提问来源于stack exchange,提问作者lonelydev101
相关产品推荐
相关产品推荐

