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
相关产品推荐
相关产品推荐

