C#中按多条件筛选集合数据并分别存入对应列表的求助
按独立条件筛选Ransaktion记录到对应集合的实现方案
需要从ransaktionList集合中分别提取满足以下条件的记录,存入对应的SearchList:
- 满足
IsFailedServerValidation()→ 存入SerialNumValDisplayList - 满足
IsFailedDuplicatePatientValidation()→ 存入DuplicateDisplayList - 满足
IsFaliedPatientAddressValidation()→ 存入PatAdressDisplayList
原代码使用连续的continue语句导致只有同时满足三个条件的记录才会被保留,且错误地将同一个记录添加到所有三个列表,无法实现独立筛选的需求。
原代码
foreach (Ransaktion ransaktion in ransaktionList) { String link = RegistrationStart.Uri(ransaktion.Id); if (!String.IsNullOrEmpty(ransaktion.Id)) { if (!String.IsNullOrEmpty(registrationFilter)) { switch (registrationFilter) { case Ransaktion.ClientSummaryStatusCategoryFailedServerValidation: if (!ransaktion.IsFailedServerValidation()) continue; if (!ransaktion.IsFailedDuplicatePatientValidation()) continue; if (!ransaktion.IsFaliedPatientAddressValidation()) continue; //link = ServerValidationsMaster.Uri(ransaktion.Id); break; } } } } var SerialNumValDisplayList = new SearchList(); var DuplicateDisplayList = new SearchList(); var PatAdressDisplayList = new SearchList(); String queueChar = ""; if (foundInQueue) queueChar = "+ "; //Providers.Instance.Ransaktion.SaveInPlay(ransaktion); string chevronUri = registrationFilter == Ransaktion.ClientSummaryStatusCategoryInProgress ? null : RegistrationStatusDetail.Uri(ransaktionId); var item = ransaktion.GetRegistrationMenuItemDetail(link, queueChar, chevronUri); SerialNumValDisplayList.Items.Add(item); DuplicateDisplayList.Items.Add(item); PatAdressDisplayList.Items.Add(item);
if (subHeaderSerialVal.Trim().Length > 0) { block.AppendBoldLine(subHeaderSerialVal); Items.Add(block); Items.Add(SerialNumValDisplayList); }
修改后的代码
// 先初始化三个结果集合,放在循环外部避免重复创建 var SerialNumValDisplayList = new SearchList(); var DuplicateDisplayList = new SearchList(); var PatAdressDisplayList = new SearchList(); foreach (Ransaktion ransaktion in ransaktionList) { // 跳过ID为空的记录 if (string.IsNullOrEmpty(ransaktion.Id)) continue; String link = RegistrationStart.Uri(ransaktion.Id); String queueChar = foundInQueue ? "+ " : ""; // 修正ransaktionId变量错误,使用当前遍历的ransaktion.Id string chevronUri = registrationFilter == Ransaktion.ClientSummaryStatusCategoryInProgress ? null : RegistrationStatusDetail.Uri(ransaktion.Id); // 分别判断每个验证失败条件,满足则添加到对应集合 if (ransaktion.IsFailedServerValidation()) { var item = ransaktion.GetRegistrationMenuItemDetail(link, queueChar, chevronUri); SerialNumValDisplayList.Items.Add(item); } if (ransaktion.IsFailedDuplicatePatientValidation()) { var item = ransaktion.GetRegistrationMenuItemDetail(link, queueChar, chevronUri); DuplicateDisplayList.Items.Add(item); } if (ransaktion.IsFaliedPatientAddressValidation()) { var item = ransaktion.GetRegistrationMenuItemDetail(link, queueChar, chevronUri); PatAdressDisplayList.Items.Add(item); } } // 后续展示逻辑保持不变 if (subHeaderSerialVal.Trim().Length > 0) { block.AppendBoldLine(subHeaderSerialVal); Items.Add(block); Items.Add(SerialNumValDisplayList); }
关键修改点
- 集合初始化位置调整:将三个
SearchList的初始化移到循环外部,避免每次循环重新创建导致之前添加的记录丢失。 - 移除互斥筛选逻辑:删除原代码中导致互斥的
continue语句,改为分别独立判断每个验证失败条件,满足条件的记录会被添加到对应的集合(一个记录可同时属于多个集合)。 - 修正变量错误:将
ransaktionId改为ransaktion.Id,确保使用当前遍历的记录ID。 - 优化条件判断顺序:先跳过ID为空的记录,减少无效逻辑执行。
内容的提问来源于stack exchange,提问作者Della
相关产品推荐
相关产品推荐

