如何用.NET Linq在驱动Inf字符串列表中匹配PNP硬件ID
问题:匹配硬件PNP ID与驱动Inf文件中的条目
我有一个存储硬件PNP ID的List(Of String),示例如下:
Dim ListOfPNPIds As New List(Of String) From { "PCI\VEN_8086&DEV_3E9B&SUBSYS_22A817AA&REV_00", "PCI\VEN_8086&DEV_3E9B&SUBSYS_22A817AA", "PCI\VEN_8086&DEV_3E9B&CC_030000", "PCI\VEN_8086&DEV_3E9B&CC_0300", "PCI\VEN_8086&DEV_3E9B" }
同时我把驱动Inf文件内容读取到另一个List(Of String)中,包含硬件ID的行带有其他文本,示例如下:
Dim ListOfDriverInf As New List(Of String) From { "%iCFLDTGT1% = iCFL_w10_DS, PCI\VEN_8086&DEV_3E90", "%iCFLDTGT2% = iCFL_w10_DS, PCI\VEN_8086&DEV_3E92", "%iCFLDTWSGT2% = iCFL_w10_DS, PCI\VEN_8086&DEV_3E96", "%iCFLHALOGT2% = iCFL_w10_DS, PCI\VEN_8086&DEV_3E9B" }
我需要用Linq查询判断ListOfDriverInf中是否有项包含ListOfPNPIds中的任意一个ID。硬编码指定ID的方式能得到预期结果,但无法遍历所有PNP ID:
' 硬编码可行,但无法遍历ListOfPNPIds Dim result = ListOfDriverInf.Any(Function(x) x.Contains("PCI\VEN_8086&DEV_3E9B"))
我尝试过下面的写法,但无法正常工作:
' 此写法错误,因为Find返回的是匹配的元素而非布尔值 ListOfPNPIds.Any(Function(p) ListOfDriverInf.Find(Function(s) s.Contains(p)))
需要一个能正确匹配的Linq查询,比如当ListOfPNPIds中的PCI\VEN_8086&DEV_3E9B与ListOfDriverInf中的%iCFLHALOGT2% = iCFL_w10_DS, PCI\VEN_8086&DEV_3E9B匹配时返回结果。
解决方案
问题出在你用了List.Find,它返回的是第一个匹配的元素,而Any需要的是布尔值。把Find换成Any就能正确判断是否存在匹配项。
基础判断:是否存在匹配条目
有两种等价的写法,任选其一即可:
' 写法1:从驱动Inf列表出发,检查是否有行包含任意PNP ID Dim hasMatch = ListOfDriverInf.Any(Function(infLine) ListOfPNPIds.Any(Function(pnpId) infLine.Contains(pnpId)) )
' 写法2:从PNP ID列表出发,检查是否有ID被任意Inf行包含 Dim hasMatch = ListOfPNPIds.Any(Function(pnpId) ListOfDriverInf.Any(Function(infLine) infLine.Contains(pnpId)) )
两种写法都会返回True(存在匹配)或False(无匹配)。
进阶:获取所有匹配的Inf行
如果需要拿到所有符合条件的Inf行,而不只是判断是否存在,可以用Where:
Dim matchingInfLines = ListOfDriverInf.Where(Function(infLine) ListOfPNPIds.Any(Function(pnpId) infLine.Contains(pnpId)) ).ToList()
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

