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

XML LINQ匹配问题:实现locoName包含ShortName元素的匹配

问题解决:LINQ匹配包含ShortName的locoName

现有XML结构

<DLC>
    <ObjectClass>RVM_GWR_Class166_DMSL_C</ObjectClass>
    <ShortName>Class166</ShortName>
</DLC>
<DLC>
    <ObjectClass>RVM_BR_Class170_DMCL_W_C</ObjectClass>
    <ShortName>Class170</ShortName>
</DLC>

原有LINQ代码

原有代码通过判断locoName与ObjectClass元素值相等实现匹配:

var values = xml.Descendants("DLC")
    .Where(i => i.Element("ObjectClass").Value == locoName)
    .Select(DLC => new
    {
        ShortName = (string)DLC.Element("ShortName"),
        DisplayName = (string)DLC.Element("DisplayName"),
    });

需求与错误尝试

实际需求是判断locoName字符串包含ShortName元素的值(例如locoName为"RVM_GWR_Class166_Z_ABC123"时,匹配ShortName为"Class166"的DLC节点)。

错误写法如下:

.Where(locoName.Contains(i => i.Element("ShortName").Value))

编译报错:

Cannot convert lambda expression to type 'string' because it is not a delegate type

正确LINQ写法

错误原因是string.Contains()方法接收的是字符串参数,无法直接传入lambda表达式。正确写法是在Where的lambda表达式内部,对每个DLC节点提取ShortName的值,再判断locoName是否包含该值:

var values = xml.Descendants("DLC")
    .Where(i => locoName.Contains(i.Element("ShortName").Value))
    .Select(DLC => new
    {
        ShortName = (string)DLC.Element("ShortName"),
        DisplayName = (string)DLC.Element("DisplayName"),
    });

如果要避免ShortName元素不存在导致的空引用问题,可以增加空判断:

var values = xml.Descendants("DLC")
    .Where(i => i.Element("ShortName") != null && locoName.Contains(i.Element("ShortName").Value))
    .Select(DLC => new
    {
        ShortName = (string)DLC.Element("ShortName"),
        DisplayName = (string)DLC.Element("DisplayName"),
    });

内容的提问来源于stack exchange,提问作者Dan Sewell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 10:42:07