【问题标题】:Pass data from a CSVReader to a method inside a loop将数据从 CSVReader 传递到循环内的方法
【发布时间】:2020-02-22 11:44:42
【问题描述】:

我有一个包含以下数据的 CSV

month,year,speed
12,2010,76
2,2000,45
12,1940,30

我正在使用读取它的第 3 方加载。简而言之,它是一个 CSVReader 类,能够像这样从名为 input 的文件中获取数据

List<Dictionary<string, object>> data = CSVReader.Read("input");

然后,使用 for 循环,我能够以这种方式检索数据

for(var i=0; i < data.Count; i++) {
    print ("month" + data[i]["month"] + " " +
           "year" + data[i]["year"] + " " +
           "speed " + data[i]["speed"]);
}

除了在 for 循环内部,我想将每年和每月(一个接一个)传递给另一个函数,该函数将诸如双精度数(而不是对象)之类的参数作为参数,但我不知道如何

for(var i=0; i < data.Count; i++) {
    // Get month and year
    function(month, year);
}

【问题讨论】:

  • 函数(data[i].month, data[i].year);

标签: c# list loops csv


【解决方案1】:

如果我正确解释了这一点并且您的问题是:“如何将 object 类型的值传递给采用 double 类型参数的函数?”,那么您可以:
1)铸造价值 像这样:

for (var i = 0; i < data.Count; i++) {
    double month = (double)data[i]["month"];
    // Same for year.
    function(month, year);
}

请注意,如果您要转换的值无法转换为目标类型(即,您正在读取的 csv 包含一些损坏的行),则会导致抛出异常。如果您确定这不是问题,您可以这样做,但是,如果您想确定,您可以选择选项 2,即
2) 使用as 运算符 像这样:

for (var i = 0; i < data.Count; i++) {
    double? month = data[i]["month"] as double?;
    if (!month.HasValue) {
        Console.WriteLine($"Month value on line {i + 1} is corrupted; Skipping...");
        break;
    }
    // Same for year.
    function(month.Value, year.Value);
}

在这种情况下,如果值不是double 类型,month 将被分配null 的值(这就是我们使用可为空的double? 类型的原因)。这使您可以检查转换是否成功,而无需处理可能的异常。

【讨论】:

  • CSV 没有指定标题。我怎么能在不创建文件头的情况下添加它?
  • @BárbaraPeres 很抱歉,但我不完全确定我理解你。您是说您的 CSV 数据不再有标题行,即,您现在有:month,year,speed \n 12,2010,76 \n ... 而不是:12,2010,76 \n ...
  • @BárbaraPeres 好吧,在那种情况下,提供的某些信息根本没有任何意义:1)您说您要检索这样的数据:data[i]["month"],但没有@ 987654334@ 字段开头 2) 我不知道特定的CSVReader.Read() 方法,但从您的帖子来看,您设法将数据读入List&lt;Dictionary&lt;string, object&gt;&gt;。但是,如果没有标题信息,您的字典键将变为 null 或(不太可能)空字符串。在向字典中添加条目时,这两种情况都会导致抛出异常。
  • @BárbaraPeres 因此,似乎缺少一些相关信息。我建议您在单独的问题中添加它,因为这与原始问题无关(如何将object 转换为double)。
  • 我听从了你的建议 - stackoverflow.com/questions/58748243/…
猜你喜欢
  • 1970-01-01
  • 2020-10-14
  • 2021-07-24
  • 2019-03-29
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2018-05-24
  • 1970-01-01
相关资源
最近更新 更多