[英]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.