WinForms C# 酿造日志多条件搜索功能无返回结果问题求解
代码核心问题
1. criteriaSort条件判断逻辑错误
- WinForm控件的
Text属性永远不会返回null,未输入时只会是空字符串"",你代码中所有判断dateCriteria.Text == null的分支永远无法触发,导致叠加日期的多条件分支、配方+酿酒师的双条件分支(该分支要求dateCriteria.Text == null)都无法命中,最终会直接进入最后的else分支。 - 部分逻辑混用了单
&和双&&,单&不会做短路判断,既可能引发空引用异常,也会导致判断逻辑不符合预期。 - 未做无任何搜索条件的兜底判断,进入
else分支时如果有未选中的筛选项,调用SelectedItem.ToString()会直接抛出空引用异常,就算没抛异常,getResults要求三个参数都匹配日志内容,也会因为空值无法匹配返回无结果。
2. getResults匹配逻辑无维度区分(潜在问题)
你当前直接用log.Contains()匹配参数,不区分参数对应的维度,比如某个酿酒师的名字和某个配方名重复时,会出现误匹配。
修复方案
第一步:重写criteriaSort的判断逻辑
// 确定当前选中的搜索条件并调用对应的getResults方法 public string criteriaSort() { bool hasRecipe = recipeCriteria.SelectedItem != null; bool hasBrewer = brewerCriteria.SelectedItem != null; bool hasDate = !string.IsNullOrEmpty(dateCriteria.Text); if (hasRecipe && !hasBrewer && !hasDate) { string recipe = recipeCriteria.SelectedItem.ToString(); return getResults(recipe); } else if (!hasRecipe && hasBrewer && !hasDate) { string brewer = brewerCriteria.SelectedItem.ToString(); return getResults(brewer); } else if (!hasRecipe && !hasBrewer && hasDate) { string date = dateCriteria.Text; return getResults(date); } else if (hasRecipe && hasBrewer && !hasDate) { string recipe = recipeCriteria.SelectedItem.ToString(); string brewer = brewerCriteria.SelectedItem.ToString(); return getResults(recipe, brewer); } else if (hasRecipe && !hasBrewer && hasDate) { string recipe = recipeCriteria.SelectedItem.ToString(); string date = dateCriteria.Text; return getResults(recipe, date); } else if (!hasRecipe && hasBrewer && hasDate) { string brewer = brewerCriteria.SelectedItem.ToString(); string date = dateCriteria.Text; return getResults(brewer, date); } else if (hasRecipe && hasBrewer && hasDate) { string recipe = recipeCriteria.SelectedItem.ToString(); string brewer = brewerCriteria.SelectedItem.ToString(); string date = dateCriteria.Text; return getResults(recipe, brewer, date); } else { // 无任何搜索条件的兜底逻辑,可按需调整为返回所有日志 return "请至少选择一个搜索条件"; } }
第二步:优化getResults匹配逻辑(推荐)
假设你的日志固定顺序为[0]配方、[1]酿酒师、[2]日期,按对应维度匹配避免误匹配,三参数重载修改示例:
// 接收三个搜索条件的重载方法 public string getResults(string recipe, string brewer, string date) { List<List<string>> brewLogList = brewLogs_ListOFlists(); List<List<string>> searchResults = new List<List<string>>(); string formatedSearchResults = ""; foreach (List<string> log in brewLogList) { // 按维度精准匹配,可按需添加Trim()、忽略大小写的逻辑优化兼容 if (log[0] == recipe && log[1] == brewer && log[2] == date) { searchResults.Add(log); } } if (searchResults.Count > 0) { foreach (List<string> log in searchResults) { formatedSearchResults += log[0] + ", " + log[1] + ", " + log[2] + Environment.NewLine; } } else { formatedSearchResults = "No brew log found matching that criteria"; } return formatedSearchResults; }
其余重载的getResults方法也按照对应参数的维度调整匹配逻辑即可。
内容的提问来源于stack exchange,提问作者MycoNut
相关产品推荐
相关产品推荐

