Кастинг продолжает получать ошибки - PullRequest
1 голос
/ 08 ноября 2019

У меня есть CSV со следующими данными (без заголовка)

12,2010,76.5
2,2000,45
12,1940,30.2

, и я читаю данные в List<List<object>>.

Чтобы узнать, что в каждой строке истолбец / строка Я использую следующий цикл

List<List<object>> data = CSVReaderNoHeader.Read("input")

for (var i = 0; i < data.Count; i++)
{

    double month = (double)(int)data[i][0];
    print($"month:{month} ////END");

    double year= (double)(int)data[i][1];
    print($"year:{year} ////END");

    double temperature= (double)data[i][2];
    print($"temperature:{temperature} ////END");

}

Да, мне нужно создавать двойники, поэтому я распаковываю и кастую (может вместо этого использовать double.Parse).

Я могу печатать месяц и год очень хорошо, но при достижении double temperature= (double)data[i][2]; выдает следующую ошибку

InvalidCastException: указанное приведение недействительно.

Я напечатал то, что находится в данных [i] [2] перед этой строкой (print(data[i][2]);), просто чтобы посмотреть, все ли там в порядке и получил 76,5 , как и ожидалось. Затем протестировали также с использованием

double temperature= (double)(double)data[i][2];
double temperature= (double)(float)data[i][2];

(что, я думаю, не нужно было бы добавлять дополнительные (double) / (float)) и

object tempr = data[i][2];
double temperature;
temperature = (double)tempr;

, но проблема осталась. Итак, я продолжил и набрал print(data[i][2].GetType());, чтобы посмотреть, может ли возвращаемый тип быть приведен к двойному. В результате я получил System.String .

Зная это, я попробовал методы double.TryParse, double.Parse и Convert.ToDouble, но ни один из них не работал

double.TryParse(data[i][2], out temperature);

Аргумент 1: невозможно преобразовать из «объекта» в строку.

double temperature = double.TryParse(data[i][2]);

Аргумент 1: невозможно преобразовать из «объекта» в строку.

double temperature = System.Convert.ToDouble(data[i][2]);

FormatException: входная строка была в неправильном формате.

Как тогда я должен ее привести?

1 Ответ

3 голосов
/ 08 ноября 2019

Поскольку ваши числа используют точку в качестве десятичного разделителя, а ваша системная локализация может использовать другое, вы можете использовать это:

using System.Xml;

double temperature = XmlConvert.ToDouble(data[i][2].ToString());

Это вызовет исключение в случае ошибки синтаксического анализа.

Так что вы можете попробовать ... поймать, чтобы управлять им.

Возможно, вам потребуется добавить System.Xml к ссылкам сборки проекта.

В противном случае вы можете использовать решение @Fabjan:

if (double.TryParse(data[i][2].ToString(),
                    System.Globalization.NumberStyles.Any,
                    System.Globalization.CultureInfo.InvariantCulture,
                    out var temperature);
  IsOk();
else
  IsNotOk();
...