C#中LINQ返回匿名类型IEnumerable与接口元组类型不匹配如何解决
问题说明
现有不可修改的接口定义如下,需要给出对应实现:
IEnumerable<(string valueA, decimal valueB)> GetData
初始编写的LINQ读取逻辑存在类型不匹配问题,原代码如下:
var fetchedData = File.ReadAllLines(filePath) .Skip(1) .Select(a => x.Split(';')) .Select(a => new { valueB= decimal.Parse(a[0]), valueA= a[1] }); return fetchedData;
问题根源是第二个Select投影生成的是匿名类型集合,和接口要求返回的命名元组(ValueTuple)集合类型不一致,同时第一行Select里还存在未定义变量x的笔误。
修复方法
只需要做两处调整:
- 修正第一行
Select里的变量笔误,将未定义的x替换为当前遍历的行参数 - 将匿名类型投影替换为命名元组投影,保证元组的成员名称、类型和接口定义完全匹配即可,不需要额外类型转换
修复后的完整代码:
var fetchedData = File.ReadAllLines(filePath) .Skip(1) .Select(line => line.Split(';')) .Select(parts => ( valueA: parts[1], valueB: decimal.Parse(parts[0]) )); return fetchedData;
提示:C# 7.0及以上版本支持的命名元组是值类型,会按成员名称和类型做匹配,只要投影出来的元组元素名、对应类型和接口签名一致,就可以直接返回,编译时会自动做类型适配。注意不要把
valueA和valueB的顺序写反,虽然元组也支持按位置匹配,但名称写对可以避免不必要的隐式类型转换问题。
内容的提问来源于stack exchange,提问作者hunter44
相关产品推荐
相关产品推荐

