C#判断文本含紧急列表词且不含非紧急列表短语的问题排查
问题分析与修复
核心问题
你的代码返回不符合预期的结果,主要源于语法错误和逻辑偏差:
- 语法错误导致代码无法正确执行或判断逻辑失效
- 现有逻辑只要文本包含任意非紧急短语就直接返回No,忽略了文本中可能存在独立紧急词汇的情况(比如测试案例1中的
URGENT)
代码中的具体错误
- 紧急列表里的
immediately未加引号,属于语法错误 wordDelimiters定义与使用不匹配(变量名少了s),且用空字符串分割会把每个字符拆成单独元素,完全无法正确提取单词string.Contains的大小写忽略写法错误,正确写法应为mydata.Contains(x, StringComparison.OrdinalIgnoreCase)(.NET Core 2.1+支持)或使用IndexOf判断- 逻辑错误:只要文本包含非紧急短语就返回No,不符合测试案例中“存在独立紧急词汇时仍返回Yes”的预期
修正后的代码
根据你的测试案例和需求(文本包含紧急列表词汇,且存在未被非紧急短语包含的紧急词汇时返回Yes),修正后的代码如下:
var urgentList = new List<string>() { "Urgent", "Immediate", "immediately" }; var nonUrgentList = new List<string>() { "Important information: urgent send", "notice immediately", "Important notice: urgent ", "immediately send it back" }; // 拆分文本为单词(按空白字符分割,去除空项) var words = mydata.Split(new[] { ' ', '\t', '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries); // 判断是否存在紧急词汇,且该词汇未被任何非紧急短语包含 bool hasValidUrgentWord = words.Any(word => urgentList.Contains(word, StringComparer.OrdinalIgnoreCase) && // 检查该紧急词汇是否不在任何文本中存在的非紧急短语里 !nonUrgentList.Any(phrase => phrase.IndexOf(word, StringComparison.OrdinalIgnoreCase) >= 0 && mydata.IndexOf(phrase, StringComparison.OrdinalIgnoreCase) >= 0) ); string indicator = hasValidUrgentWord ? "Yes" : "No";
逻辑说明
- 正确拆分文本为独立单词,避免字符级别的无效分割
- 对于每个紧急词汇,检查两个条件:
- 文本中存在该紧急词汇
- 该词汇没有出现在任何文本中存在的非紧急短语里
- 只要存在一个符合条件的紧急词汇,就返回Yes,否则返回No
测试案例验证
- 测试案例1:文本包含
URGENT(不在任何非紧急短语中),同时包含immediately send it back(非紧急短语),此时URGENT符合条件,返回Yes - 测试案例2:文本中没有任何紧急词汇,返回No
内容的提问来源于stack exchange,提问作者dotnetdev1
相关产品推荐
相关产品推荐

