You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 21:33:11