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#方式不行。它在第一次迭代后失去了轨道......为什么???
请帮忙。
答案 0 :(得分:17)
我认为这些是不同的:
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++)
答案 1 :(得分:5)
我对VB并不熟悉,但是你确实看到你没有收到你的收藏的结尾,因为你从元素的数量中减去1并使用你的'小于'(&lt;)运算符环。这意味着你的循环将在最后一项之前退出。
我建议从循环条件中删除' - 1'。或者你可以切换到'小于或等于'(&lt; =),但前者在这种情况下更有意义。
答案 2 :(得分:4)
我认为这是针对运营商的吗?
在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次。
所以修复是:
在C#循环检查中抛弃“ - 1”
为清楚起见,我将VB代码编写为
For i As Integer = 1 To firstFile.numberOfSeries
和C#代码为
for (int i = 0; i < firstfile.numberofseries; i++)
因为,在每种情况下,firstFile.numberOfSeries是循环运行的次数。
答案 3 :(得分:1)
尝试改变:
for (int i = 0; i < firstfile.numberofseries - 1; i++)
{
}
到
int index = firstfile.numberofseries;
for (int i = 0; i < index; i++)
{
}
不知道它被定义为什么类型的结构,因为我猜测当你添加到firstfile / secondfile结构时,循环就会被抛出。
另外,请接受解决您挑战的答案。很高兴知道它已经固定而不是猜测并试图深入研究一个不存在的问题。 :)