![](/img/trans.png)
[英]Could not convert IEnumerable of anonymous type to IEnumerable<dynamic>?
[英]Returning IEnumerable with an anonymous type
我有一个类似这样的界面:
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;
问题是fetchedData
与接口期望的类型不同。 我需要返回IEnumerable<(string valueA, decimal valueB)>
但fetchedData
是另一种类型。
只需在您的选择中返回一个命名元组,而不是匿名对象:)
IEnumerable<(string valueA, decimal valueB)> GetData()
=> File.ReadAllLines(filePath)
.Skip(1)
.Select(a => a.Split(';')) // here, you used x instead of a
.Select(a => (valueA: a[1], valueB: decimal.Parse(a[0])));
您的代码存在一些问题:
您的界面期望结果是Tuple<string, decimal>
这是符号背后的实际类型(string valueA, decimal valueB)
您的代码,尤其是以下行:
.Select(a => new { valueB= decimal.Parse(a[0]), valueA= a[1] })
生成具有以下字段的匿名对象{ decimal valueB; string valueA; }
{ decimal valueB; string valueA; }
{ decimal valueB; string valueA; }
。 问题是 .NET 将声明一个类来表示匿名类型,这与您最初从接口请求的 Tuple 类型不兼容。
以下是应满足接口的代码修复:
var fetchedData = File.ReadAllLines(filePath)
.Skip(1)
.Select(a => x.Split(';'))
.Select(a => (a[1], decimal.Parse(a[0]) ) );
return fetchedData;
如果接口坚持元组(命名元组),让我们提供它:
return File // let's drop fetchedData and just return
.ReadLines(filePath) // Let's drop All - premature materialization
.Skip(1)
.Select(a => x.Split(';'))
.Select(a => (a[1], decimal.Parse(a[0]));
您所要做的就是将{..}
更改为(...)
并保持正确的顺序(第一个string
而不是decimal
)。 您可能想要输入名称,但这不是必需的:
return File
.ReadLines(filePath)
.Skip(1)
.Select(a => x.Split(';'))
.Select(a => (valueA : a[1], valueB : decimal.Parse(a[0]));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.