Я написал точный код в vb и C #, и он не работает, надеюсь, та же логика идентична

Новичок в 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

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

    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 правильно читает двоичный считыватель и правильно индексирует следующую позицию... способ С# - нет. Он теряет след после первой итерации... почему???

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


person Sean P    schedule 10.08.2010    source источник
comment
Что именно вы подразумеваете под потерей следа?   -  person CubanX    schedule 10.08.2010
comment
Ни один из этих параметров не должен быть ByRef/ref.   -  person SLaks    schedule 10.08.2010
comment
Некоторые непрошенные советы: включите параметр strict для вашего кода VB.Net, заставьте его работать правильно, а затем перенесите на C#.   -  person Binary Worrier    schedule 10.08.2010
comment
На самом деле мне нужно, чтобы они были по ссылке, иначе читатель потеряет свое место при чтении файла. Также я не мог пометить как ответ, потому что мне сказали подождать 7 минут ... я получил ответ в течение 30 секунд.   -  person Sean P    schedule 10.08.2010
comment
@Sean: Нет, рефери для этого не нужен. В .NET объект (читатель) всегда проходит как ссылка. Ваш код проходит по ссылке, излишне сложный.   -  person Henk Holterman    schedule 10.08.2010
comment
Я смущен, зачем тогда нужно ключевое слово ref? Я ошибался, думая, что все передается через val? Думаю пора гуглить :(   -  person Sean P    schedule 12.08.2010
comment
msdn.microsoft.com/en-us/library/8f1hz171.aspx Я читаю подобные статьи... зачем ключевое слово ref, если оно вам не нужно?!   -  person Sean P    schedule 12.08.2010
comment
codeproject.com/KB/cs/parameter_object_by_value.aspx Теперь я совсем запутался. ..кто прав. В этой статье говорится, что по умолчанию передается значение?   -  person Sean P    schedule 12.08.2010


Ответы (4)


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

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

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

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

или лучше:

for (int i = 0; i < firstfile.numberofseries; i++)
person Douglas    schedule 10.08.2010
comment
Правильно — VB — это то же самое, что и ‹=. +1 - person Ash Burlaczenko; 10.08.2010

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

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

person Paul Ruane    schedule 10.08.2010

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

In C#

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

Это будет работать 10 раз

in vb

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

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

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

Откажитесь от «- 1» при проверке цикла C#

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

For i As Integer = 1 To firstFile.numberOfSeries

и код С# как

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

потому что в каждом случае firstFile.numberOfSeries — это количество запусков цикла.

person McKay    schedule 10.08.2010

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

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

to

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

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

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

person Keith Barrows    schedule 10.08.2010