列表与Hidden Field编码匹配计数问题及C#代码修正求助
问题修正:统计匹配编码数量的C#代码错误修复
原代码存在的核心问题
- 匹配逻辑完全错误:
原代码中x.FoodCode.ToString() == listCS.Any().ToString()是逻辑误区,listCS.Any()仅判断集合是否包含元素,返回布尔值,转成字符串后只会是"True"或"False",根本无法实现「判断FoodCode是否在Hidden Field的编码列表中」的需求。 - 语法错误:
else (itmAlreadyExistsCnt > 1)缺少if关键字,属于无效语法,无法编译。 - 潜在异常风险:
直接使用Convert.ToInt32(categoryId)和Convert.ToInt32(subCategoryId),如果传入的字符串无法转换为整数,会抛出FormatException。 - 空值未处理:
hfCheckedChildCS.Value为空时,Split(',')会生成包含空字符串的集合,可能导致误匹配。
修正后的代码
public void GetCSWSTUCPAFreeRestrictBlkFood(string categoryId, string subCategoryId) { string rtnMsg = string.Empty; int itmAlreadyExistsCnt = 0; List<CurrentDietSummary> restrData = GetPARestrictedFood(); // 处理Hidden Field的值:拆分后过滤空字符串,避免无效匹配 var listCS = hfCheckedChildCS.Value?.Split(',', StringSplitOptions.RemoveEmptyEntries).ToList() ?? new List<string>(); if (restrData != null && restrData.Count > 0) { // 先验证categoryId和subCategoryId是否能正常转成整数 if (int.TryParse(categoryId, out int catId) && int.TryParse(subCategoryId, out int subCatId)) { // 正确的匹配逻辑:判断FoodCode的字符串形式是否在listCS集合中 itmAlreadyExistsCnt = restrData.Count(x => x.CategoryId == catId && x.SubCategoryId == subCatId && listCS.Contains(x.FoodCode.ToString())); } else { // 处理参数无法转换为整数的情况 rtnMsg = "Invalid category or sub-category ID."; return; } } if (itmAlreadyExistsCnt == 1) rtnMsg = "Detail corresponding to Item already exist."; else if (itmAlreadyExistsCnt > 1) rtnMsg = "Detail corresponding to some Item(s) already exist."; // 可根据需求添加itmAlreadyExistsCnt为0时的提示逻辑 }
关键优化点说明
- 使用
StringSplitOptions.RemoveEmptyEntries拆分Hidden Field的值,自动过滤空字符串,避免无效匹配。 - 用
int.TryParse替代Convert.ToInt32,避免参数非法时抛出异常,同时增加错误分支处理。 - 替换错误的匹配逻辑为
listCS.Contains(x.FoodCode.ToString()),实现「判断当前食物编码是否在目标列表中」的核心需求。 - 修复
else if的语法错误,确保分支逻辑正常执行。
内容的提问来源于stack exchange,提问作者Geet
相关产品推荐
相关产品推荐

