.NET Maui中C# StringComparison与Contains匹配植物学名问题
解决植物学名匹配问题
问题核心
PlantNet返回的学名s = "Centaurea solstitialis L."带有命名人后缀(如L.),数据库中的z = "Centaurea solstitialis, C. melitensis"是多学名用逗号分隔的格式,直接调用Contains方法会因为字符串不完全匹配返回false,但二者的核心学名是一致的。
解决方案
1. 编写字符串清理工具方法
先去除学名中的冗余后缀,同时拆分数据库中的多条目:
// 清理单条学名:去除末尾的命名人后缀(如"L.") string CleanScientificName(string name) { int lastSpacePos = name.LastIndexOf(' '); // 判断最后一段是否为带点的缩写(命名人标记) if (lastSpacePos != -1 && name.Substring(lastSpacePos + 1).Contains('.')) { return name.Substring(0, lastSpacePos).Trim(); } return name.Trim(); } // 处理数据库中的多学名字符串,拆分并清理每个条目 IEnumerable<string> ProcessDbNames(string dbNameStr) { return dbNameStr.Split(',') .Select(n => n.Trim()) .Select(n => CleanScientificName(n)); }
2. 执行匹配逻辑
用清理后的核心学名做精准匹配:
string apiName = "Centaurea solstitialis L."; string dbNames = "Centaurea solstitialis, C. melitensis"; string cleanedApiName = CleanScientificName(apiName); var cleanedDbNameList = ProcessDbNames(dbNames); // 忽略大小写匹配,覆盖更多可能的格式差异 bool isMatched = cleanedDbNameList.Any(name => name.Equals(cleanedApiName, StringComparison.OrdinalIgnoreCase)); // 此时isMatched会返回true
额外优化建议
如果遇到更复杂的学名格式(如亚种、变种标记),可以进一步调整清理逻辑,只保留属名+种加词的核心部分,这是植物学名识别的关键匹配单元。
内容的提问来源于stack exchange,提问作者Chris Angeles
相关产品推荐
相关产品推荐

