C# 特定条件匹配下的赋值处理:双引号开头term赋值报错问题
问题根因
term = term 本身是合法的C#语法,没有实际执行逻辑也不会直接抛出错误,你遇到的报错大概率来自两个场景:
- 上方
$开头的分支对originalTerm做了赋值,其余分支没有对该变量初始化,如果后续代码用到originalTerm,会触发「使用未赋值局部变量」的编译错误 - 如果你预期双引号开头的搜索词完全不做任何修改,但实际被拼接了collections筛选条件,是因为collections的判断逻辑写在全局else块内,只要没走
$开头的分支,都会执行这段拼接逻辑,不符合你的预期。
修正方案
如果你要求以双引号开头的term完全不做任何修改直接透传,可以直接调整分支逻辑,同时统一初始化originalTerm避免变量未赋值错误:
// 先统一初始化originalTerm,避免未赋值报错 originalTerm = string.Copy(term); if (term.StartsWith("$")) { // 移除$前缀,不做其他修改 term = term.Substring(1, term.Length - 1); } // 双引号开头直接跳出,不执行后续修改逻辑 else if (term.StartsWith("\"")) { // 无需任何操作,直接透传 } else { // 转义特殊字符 term = LuceneReservedCharacterPattern.Replace(term, @"\$0"); // 拼接短语匹配提升权重 term = string.Concat("(", term, ") OR \"", term, "\"^2"); // 拼接集合筛选条件 if (collections != null && !collections.Any(c => c.Equals("all", StringComparison.OrdinalIgnoreCase))) { term = string.Concat("(", term, ") AND collections:(", string.Join(" OR ", collections), ")"); } }
如果你的需求是双引号开头的term只跳过转义和短语拼接,仍然要追加集合筛选条件,可以用以下调整:
originalTerm = string.Copy(term); if (term.StartsWith("$")) { term = term.Substring(1, term.Length - 1); } else { if (!term.StartsWith("\"")) { // 转义特殊字符 term = LuceneReservedCharacterPattern.Replace(term, @"\$0"); // 拼接短语匹配提升权重 term = string.Concat("(", term, ") OR \"", term, "\"^2"); } // 不管是不是双引号开头,都追加集合筛选条件 if (collections != null && !collections.Any(c => c.Equals("all", StringComparison.OrdinalIgnoreCase))) { term = string.Concat("(", term, ") AND collections:(", string.Join(" OR ", collections), ")"); } }
内容的提问来源于stack exchange,提问作者devram
相关产品推荐
相关产品推荐

