簡體   English   中英

使用匿名類型返回 IEnumerable

[英]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])));

您的代碼存在一些問題:

  1. 您的界面期望結果是Tuple<string, decimal>這是符號背后的實際類型(string valueA, decimal valueB)

  2. 您的代碼,尤其是以下行:

     .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]));

您在這里混淆了匿名類型值元組

當您的接口返回一個元組時,您的 LINQ 查詢會產生一個匿名類型。 將您的查詢更改為:

var fetchedData = File.ReadAllLines(filePath)
    .Skip(1)
    .Select(a => x.Split(';'))
    .Select(a => (a[1], decimal.Parse(a[0])));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM