如何比较IEnumerable<List>与IEnumerable<string>并匹配获取对应ID?
问题分析与解决方法
你的代码返回count=0的核心原因是错误地调用了errorMessages.ToString():
如果errorMessages是列表类型(不管是字符串列表还是自定义对象列表),直接调用ToString()只会返回类型名称(比如System.Collections.Generic.List1[System.String]),而不是列表里的具体元素值,导致Where`条件永远无法匹配,结果自然为空。
下面针对不同的errorMessages类型给出修正方案:
情况1:errorMessages是字符串列表(List<string>)
先将列表转为不区分大小写的集合,再判断x.Value是否在集合中:
// 转成HashSet提升匹配效率,同时指定不区分大小写的比较器 var errorMessageSet = new HashSet<string>(errorMessages, StringComparer.OrdinalIgnoreCase); List<ListItem> commonMatch = errorDetailsList.Where(x => errorMessageSet.Contains(x.Value)).ToList();
情况2:errorMessages是自定义对象列表(每个对象含Value属性)
先提取所有对象的Value到集合,再进行匹配:
// 提取errorMessages中所有的Value值,存入不区分大小写的HashSet var errorMessageValues = new HashSet<string>(errorMessages.Select(msg => msg.Value), StringComparer.OrdinalIgnoreCase); List<ListItem> commonMatch = errorDetailsList.Where(x => errorMessageValues.Contains(x.Value)).ToList();
提取匹配项的ID
匹配成功后,可通过Select提取对应的ID:
// 获取所有匹配项的ID列表 var matchedIds = commonMatch.Select(item => item.Id).ToList(); // 如果只需要第一个匹配的ID(存在时) if (commonMatch.Any()) { var firstMatchedId = commonMatch.First().Id; }
调试小技巧
可以临时打印errorMessages.ToString()的结果,确认输出是不是你预期的数值,这能快速验证问题所在。
内容的提问来源于stack exchange,提问作者Azhar Amin
相关产品推荐
相关产品推荐

