如何用LINQ实现字符数组匹配Table列表并返回对应HexToInt集合
C# LINQ集合匹配问题解决方法
错误代码问题分析
你写的错误代码有几个明显问题:
- 变量名写错了:
dteCharArray应该是你定义好的charArray - 逻辑方向错误:
Where是用来筛选元素的,但你要的是把每个字符转换成对应的HexToInt值,不是挑出存在的字符 - 上下文混乱:
Select(y => y.Hex)里的y根本不在当前作用域内,而且你需要的是HexToInt而非Hex属性 - 集合引用错误:
table.Any(...)里的table是单个Table对象,应该用tableList这个集合
正确的LINQ实现
按照需求,我们要遍历charArray里的每个字符,在tableList中找到Data等于该字符转字符串的项,然后取对应的HexToInt。如果遇到多个匹配项(比如Data为"d"的有两个Table),这里默认取第一个匹配的结果:
var result = charArray .Select(c => tableList.FirstOrDefault(t => t.Data == c.ToString())?.HexToInt ?? 0) // 找不到匹配时返回0,可按需调整默认值 .ToList();
用你的示例数据运行这段代码,会得到预期的[2, 0, 0, 5]。
性能优化方案
如果tableList数据量很大,每次调用FirstOrDefault都要遍历整个集合,效率偏低。可以先构建一个映射字典,把Data作为键,对应的HexToInt作为值(如果有重复的Data,这里取最后一个匹配的项,可根据需求调整):
// 先构建Data到HexToInt的映射字典 var dataHexMap = tableList.ToDictionary(t => t.Data, t => t.HexToInt, StringComparer.Ordinal); // 转换字符数组 var optimizedResult = charArray .Select(c => dataHexMap.TryGetValue(c.ToString(), out var hexVal) ? hexVal : 0) .ToList();
这种方法只需要遍历一次tableList构建字典,之后每个字符的查找都是O(1)的时间复杂度,性能更优。
内容的提问来源于stack exchange,提问作者Ulisses Farias
相关产品推荐
相关产品推荐

