2016-03-03 2 views
0

Я написал класс parse, пытаясь обработать синтаксический анализ данных из строкового массива в соответствующее значение. Я пытаюсь проверить эту программу, чтобы увидеть, будет ли она распечатывать значение parse.open, и это не так. Он печатает 0 на данный момент (что неточно), пока я не смогу понять, почему он не показывает, что мне нужно.Создание класса Parse для обработки разбора файла, считанного в

while (!r.EndOfStream) 
{ 
    ParseFileRead parse = new ParseFileRead(); 
    string line = r.ReadLine(); 

    //Send this to Parse class 
    string [] values = line.Split(','); 
    //parse records 
    Console.WriteLine(values[6]); //This is printing the accurate value for parse.open 

    ParseFileRead.Parse(values); 
    Console.WriteLine(parse.open); //This is not printing the accurate value 
} 
Console.Read(); 
vWriteFile.Close(); 

А вот мой ParseFileRead класс:

public class ParseFileRead 
{ 

    public int open { get; set; } 
    public int buy { get; set; } 
    public int sell { get; set; } 
    public double settleMM { get; set; } 
    public string account { get; set; } 
    public string underlying { get; set; } 
    public string symbol { get; set; } 

    public static void Parse(string[] arr) 
    { 
     ParseFileRead parse = new ParseFileRead(); 
     parse.account = arr[0]; 
     parse.underlying = arr[12]; 
     parse.symbol = arr[1]; 
     parse.open = Convert.ToInt32(arr[6]); 
     parse.buy = Convert.ToInt32(arr[7]); 
     parse.sell = Convert.ToInt32(arr[8]); 
     parse.settleMM = Convert.ToDouble(arr[10]); 
    } 
} 
+0

что делает значения [6] печать? возможно, проблема с преобразованием в целое число. первый оператор печати (тот, который работает) не преобразовывается. – mosca125

+0

вы воссоздаете колесо. Вокруг сидят парсеры. NET даже имеет один: 'TextFieldParser' – Plutonix

+0

Я знаю, что я воссоздаю колесо, но это задание сделать так. @ mosca125, значение 8, когда оно печатает 0, когда я вызываю parse.open –

ответ

3

Это на самом деле правильно.

Значение по умолчанию для неинициализированного int 0.

Вы создаете новый экземпляр вашего ParseFileRead класса, который будет иметь значение 0 для открытой. Затем вы проверяете свое анализируемое значение, чтобы убедиться, что оно правильно считывается с использованием Console.WriteLine(values[6]);.

Далее вы пытаетесь проанализировать свои значения с помощью функции Parse вашего класса ParseFileRead; которая является функцией void, поэтому она не имеет возвращаемого значения.

Внутри вашей функции Parse у вас есть: ParseFileRead parse = new ParseFileRead();, который создает еще один новый экземпляр вашего класса со значением 0 для open. Этот конкретный экземпляр никогда не используется в любом месте и не то же самое, как значения свойств, созданных с помощью исходного экземпляра ParseFileRead

Если поставить Console.Write в вашей Parse функции, я уверен, что вы будете видеть, что разбираемый правильно.

Так у вас есть 2 варианта:

  1. Установите свойства вашего ParseFileRead внутри Parse класса без создания нового экземпляра ParseFileRead
  2. Возвращение вновь созданного ParseFileRead экземпляра из вашей Parse функции.

Или третий вариант, который, вероятно, лучше всего, как было предложено Plutonix:

/*Parse class*/ 
public class ParseFileRead 
{ 

    public int open { get; set; } 
    public int buy { get; set; } 
    public int sell { get; set; } 
    public double settleMM { get; set; } 
    public string account { get; set; } 
    public string underlying { get; set; } 
    public string symbol { get; set; } 

    public ParseFileRead(string[] arr) 
    { 
     this.account = arr[0]; 
     this.underlying = arr[12]; 
     this.symbol = arr[1]; 
     this.open = Convert.ToInt32(arr[6]); 
     this.buy = Convert.ToInt32(arr[7]); 
     this.sell = Convert.ToInt32(arr[8]); 
     this.settleMM = Convert.ToDouble(arr[10]); 
    } 
} 

/*Parsing code*/ 

while (!r.EndOfStream) 
    { 
     string line = r.ReadLine(); 

     //Send this to Parse class 
     string [] values = line.Split(','); 
     //parse records 
     Console.WriteLine(values[6]); //This is printing the accurate value for parse.open 

     ParseFileRead parse = new ParseFileRead(values); 
     Console.WriteLine(parse.open); //This is not printing the accurate value 


    } 
+1

option 3) Измените Parse как конструктор, который семенирует значения из массива (конечно, без ввода '0') – Plutonix

+0

@Plutonix На самом деле это лучший вариант, не знаю, почему я не думал об этом в первую очередь. – drneel

+0

Да, новичок здесь, используя статические, когда я не должен быть .... –

Смежные вопросы