繁体   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