C#中AreYou方法返回意外bool值:大小写匹配逻辑排查
问题分析与修复方案
问题根源
你存储标识符时统一转成了小写(id.ToLowerInvariant()),但调用AreYou方法时,直接用传入的原始字符串(比如大写的"KHA")去匹配列表里的小写字符串。而C#中List<string>.Contains默认使用区分大小写的字符串比较,所以"KHA"和"kha"被判定为不相等,导致返回false。
修复方案
有两种可靠的修复方式:
方式1:将传入的查询字符串也转为小写(与存储逻辑保持一致)
修改AreYou方法,把传入的id也转成小写后再进行匹配:
public bool AreYou(string id) { return _identifiers.Contains(id.ToLowerInvariant()); }
方式2:使用不区分大小写的比较器
利用Contains的重载方法,指定StringComparer.OrdinalIgnoreCase进行不区分大小写的比较:
public bool AreYou(string id) { return _identifiers.Contains(id, StringComparer.OrdinalIgnoreCase); }
补充说明
- 推荐使用
OrdinalIgnoreCase或ToLowerInvariant,这两种方式不受系统区域设置影响,能保证跨环境的比较一致性。 - 两种方案都能解决你的问题,选择哪种取决于你的代码习惯:如果后续有其他需要统一小写的场景,方式1更贴合现有存储逻辑;如果只是需要比较时忽略大小写,方式2更直接。
原代码回顾
Identifiable类代码
public void AddIdentifier(string id) { _identifiers.Add(id.ToLowerInvariant()); } // 构造函数中调用AddIdentifier将所有初始标识符转为小写 public Identifiable(string[] idents) { _identifiers = new List<string>(idents.Length); foreach (string id in idents) { AddIdentifier(id); } } // 原AreYou方法(存在问题) public bool AreYou(string id) { return _identifiers.Contains(id); }
Main类测试代码
public static void Main(string[] args) { string[] identifiers = new string[] { "kha", "fren", "something" }; Identifiable identifiable = new Identifiable(identifiers); Console.WriteLine($"testing for AreYou: {identifiable.AreYou("kha")}");// 返回true Console.WriteLine($"Testing for case sensitivity AreYou: {identifiable.AreYou("KHA")}");// 原代码返回false,修复后返回true }
内容的提问来源于stack exchange,提问作者Simplylmk
相关产品推荐
相关产品推荐

