如何通过字符串属性匹配指定现有对象?C#对象查询咨询
解决方案:通过字典实现字符串到对象的映射
针对你需要根据输入字符串快速匹配对应对象的需求,最实用的方案是使用Dictionary<string, T>存储名称与对象的映射关系,避免大量if/else判断,且后续扩展极为方便。
修正后的完整代码
class Program { static void Main(string[] args) { // 初始化字典,键为对象名称,值为对应的Notes实例,支持大小写不敏感匹配 var noteDictionary = new Dictionary<string, Notes>(StringComparer.OrdinalIgnoreCase) { ["note"] = new Notes { Content = "note的内容" }, ["note2"] = new Notes { Content = "note2的内容" } }; Console.WriteLine("which note would you like?"); string input = Console.ReadLine(); // 尝试从字典中获取对应对象 if (noteDictionary.TryGetValue(input, out var targetNote)) { Console.WriteLine($"{input}'s note is {targetNote.Content}"); } else { Console.WriteLine($"There is no note called {input}"); } } } class Notes { // 将字段改为公共属性,方便外部访问 public string Content { get; set; } }
方案优势
- 扩展方便:后续新增Notes对象时,只需在字典中添加新的键值对,无需修改判断逻辑
- 匹配高效:字典的查询时间复杂度为O(1),远优于大量if/else或switch的线性扫描
- 容错性强:通过
StringComparer.OrdinalIgnoreCase实现大小写不敏感匹配,用户输入Note/NOTE都能正确匹配
原代码中的关键问题说明
- 类级别的变量初始化必须放在方法内部(比如
Main方法),不能直接写在类定义下 ToUpper是方法,调用时需要加括号:which.ToUpper()- 字符串判断不能使用
("NOTE" || "NOTE2")的语法,正确写法应为which.ToUpper() == "NOTE" || which.ToUpper() == "NOTE2",但字典方案完全替代了这种冗余判断 Notes类的notes字段默认是私有访问权限,外部无法访问,需改为公共属性which.note是错误写法——字符串类型没有note属性,必须通过名称找到对应的Notes实例后再访问其内容
内容的提问来源于stack exchange,提问作者Taxolotl
相关产品推荐
相关产品推荐

