Я написал точный код в VB и C #, и он не работает одинаково ... логика идентична ... я надеюсь - PullRequest
3 голосов
/ 10 августа 2010

Вид нового в C # и попытка немного расширить мои способности.У меня есть этот код в VB:

    Private Sub BreakdownFilesToCompare(ByRef file1BReader As BinaryReader, _
                                  ByRef file2BReader As BinaryReader, _
                                  ByRef firstFile As StandardFormatFile, _
                                  ByRef secondFile As StandardFormatFile)

    file1BReader.ReadInt32()
    file2BReader.ReadInt32()

    firstFile.numberOfSeries = file1BReader.ReadInt32
    secondFile.numberOfSeries = file2BReader.ReadInt32

    If firstFile.numberOfSeries <> secondFile.numberOfSeries Then
        WriteToConsole("The number of Elements the two files do not match...Stopping")
        Exit Sub
    End If

    For i As Integer = 0 To firstFile.numberOfSeries - 1

        Dim tempSeriesData1 As New StandardFormatFileSeries
        Dim tempSeriesData2 As New StandardFormatFileSeries

        tempSeriesData1.standardNumOfElements = file1BReader.ReadInt32
        tempSeriesData1.standardSeriesName = GetSeriesName(file1BReader)

        tempSeriesData2.standardNumOfElements = file2BReader.ReadInt32
        tempSeriesData2.standardSeriesName = GetSeriesName(file2BReader)


        For j As Integer = 0 To tempSeriesData1.standardNumOfElements - 1
            Dim tempElementData1 As New StandardFormatFileElement


            tempElementData1.standardX_TimeValue = file1BReader.ReadSingle
            tempElementData1.standardY_SampleValue = file1BReader.ReadSingle
            tempSeriesData1.standardDataElements.Add(tempElementData1)
        Next

        For k As Integer = 0 To tempSeriesData2.standardNumOfElements - 1
            Dim tempElementData2 As New StandardFormatFileElement

            tempElementData2.standardX_TimeValue = file2BReader.ReadSingle
            tempElementData2.standardY_SampleValue = file2BReader.ReadSingle

            tempSeriesData2.standardDataElements.Add(tempElementData2)



        Next

        firstFile.standardSeriesData.Add(tempSeriesData1)
        secondFile.standardSeriesData.Add(tempSeriesData2)


    Next
End Sub


Private Function GetSeriesName(ByRef bReader As BinaryReader) As String
    Dim enc As New System.Text.UTF8Encoding()
    Dim title As Byte()

    title = bReader.ReadBytes(128)
    Return enc.GetString(title)

End Function

Теперь это то, что у меня есть в C #

    private void compareStandardFormat(ref BinaryReader file1breader,ref  BinaryReader file2breader,
                                        ref FileStructure firstfile,ref FileStructure secondfile)
    {
        file1breader.ReadInt32();
        file2breader.ReadInt32();

        firstfile.numberofseries = file1breader.ReadInt32();
        secondfile.numberofseries = file2breader.ReadInt32();

        if (firstfile.numberofseries != secondfile.numberofseries)
        {
            writeToConsole("The number of Elements the two files do not match...Stopping");
            return;
        }

        for (int i = 0; i < firstfile.numberofseries - 1; i++)
        {
            StandardFormatFileSeries tempseriesdata1 = new StandardFormatFileSeries();
            StandardFormatFileSeries tempseriesdata2 = new StandardFormatFileSeries();

            tempseriesdata1.standardnumofelements  = file1breader.ReadInt32();
            tempseriesdata1.standardseriesname  = getSeriesName(ref file1breader).Trim();

            tempseriesdata2.standardnumofelements = file2breader.ReadInt32();
            tempseriesdata2.standardseriesname = getSeriesName(ref file2breader).Trim();

            for (int j = 0; j < tempseriesdata1.standardnumofelements - 1; j++)
            {
                StandardFormatFileElement tempElementData1 = new StandardFormatFileElement();

                tempElementData1.standardx_timevalue  = Convert.ToString (file1breader.ReadSingle());
                tempElementData1.standardy_samplevalue = Convert.ToString(file1breader.ReadSingle());

                tempseriesdata1.standarddataelements.Add(tempElementData1);
            }

            for (int k = 0; k < tempseriesdata2.standardnumofelements - 1; k++)
            {
                StandardFormatFileElement tempElementData2 = new StandardFormatFileElement();

                tempElementData2.standardx_timevalue = Convert.ToString(file2breader.ReadSingle());
                tempElementData2.standardy_samplevalue = Convert.ToString(file2breader.ReadSingle());

                tempseriesdata2.standarddataelements.Add(tempElementData2);
            }

            firstfile.standardseriesdata.Add(tempseriesdata1);
            secondfile.standardseriesdata.Add(tempseriesdata2);
            }

    }

    private string getSeriesName(ref BinaryReader bReader)
    {
        UTF8Encoding enc = new UTF8Encoding();
        byte[] title;

        title = bReader.ReadBytes(128);

        return enc.GetString(title);

    }

Способ VB правильно читает двоичный считыватель и правильно индексировать на следующую позицию.... способ C # не делает.Он теряет трек после первой итерации ... почему ???

, пожалуйста, помогите.

Ответы [ 4 ]

17 голосов
/ 10 августа 2010

Я думаю, что это разные:

For i As Integer = 0 To firstFile.numberOfSeries - 1
for (int i = 0; i < firstfile.numberofseries - 1; i++)

Я думаю, что прямой перевод на C #:

for (int i = 0; i <= firstfile.numberofseries - 1; i++)

или лучше:

for (int i = 0; i < firstfile.numberofseries; i++)
5 голосов
/ 10 августа 2010

Я не знаком с VB, но, похоже, вы не достигли конца своих коллекций, поскольку вы оба вычитаете 1 из числа элементов и используете оператор «меньше чем» (<) в цикле , Это означает, что ваши циклы будут выходить перед последним элементом. </p>

Я бы предложил удалить '- 1' из условий цикла. В качестве альтернативы вы можете переключиться на «меньше или равно» (<=), но первое имеет больше смысла в этом случае. </p>

4 голосов
/ 10 августа 2010

Я думаю, что это для оператора?

In C #

for (int i = 0; i < 10; i++)
{
   // inner loop
}

Это будет выполняться 10 раз

в vb

For i As Integer = 0 To 10
   rem inner loop
Next

Это будет выполняться 11 раз.

Итак, исправление:

Отбросьте "- 1" в цикле проверки C #

Для ясности я написал бы код VB как

For i As Integer = 1 To firstFile.numberOfSeries

и код C # как

for (int i = 0; i < firstfile.numberofseries; i++)

, потому что в каждом случае firstFile.numberOfSeries - это число раз, которое выполняется цикл.

1 голос
/ 10 августа 2010

попробуйте изменить:

for (int i = 0; i < firstfile.numberofseries - 1; i++)
{
}

на

int index = firstfile.numberofseries;
for (int i = 0; i < index; i++)
{
}

Не зная, к какому типу структуры это относится, я угадываю , что при добавлении вfirstfile / secondfile структуры, петля выброшена из строя.

Также, пожалуйста, примите ответ, который решает вашу проблему.Хорошо знать, что это уже исправлено, вместо того, чтобы угадывать и пытаться глубже вникнуть в несуществующую проблему.:)

...