【发布时间】:2014-12-06 15:25:38
【问题描述】:
在普通的旧 VB6 中,以下 .NET 代码的等价物是什么?
byte[] reversedContents = fileContents.Reverse().ToArray();
【问题讨论】:
-
没有。您需要手动对其进行编码。 (标准方法是循环最多 1/2 的数组并进行适当的交换)。
在普通的旧 VB6 中,以下 .NET 代码的等价物是什么?
byte[] reversedContents = fileContents.Reverse().ToArray();
【问题讨论】:
您可以使用for 循环来实现
For i = 0 To UBound(a) \ 2
k = a(i) : a(i) = a(UBound(a) - i) : a(UBound(a) - i) = k
Next i
【讨论】:
如果我们可以假设一个动态字节数组和一个非 DBCS 语言环境,那么这通常很快(以及单行):
Bytes = StrConv(StrReverse(StrConv(Bytes, vbUnicode)), vbFromUnicode)
即使不快,也不会慢很多。然而,当数组很短时,它会变慢。
时间对比测试台:
Option Explicit
Private Sub Easy()
Dim Bytes() As Byte
Dim Iterate As Long
Bytes = StrConv("abcdefghijklmnopqrstuvwxyz", vbFromUnicode)
For Iterate = 1 To 100000
Bytes = StrConv(StrReverse(StrConv(Bytes, vbUnicode)), vbFromUnicode)
Next
End Sub
Private Sub Hard()
Dim Bytes() As Byte
Dim Iterate As Long
Dim I As Long
Dim B As Byte
Bytes = StrConv("abcdefghijklmnopqrstuvwxyz", vbFromUnicode)
For Iterate = 1 To 100000
For I = 0 To UBound(Bytes) \ 2
B = Bytes(I)
Bytes(I) = Bytes(UBound(Bytes) - I)
Bytes(UBound(Bytes) - I) = B
Next
Next
End Sub
Private Sub Main()
Easy
Hard
End Sub
但总的来说,“硬”方法更安全。
【讨论】:
其他答案对我很有帮助,但我发现我的数组是使用自定义拆分例程构建的,该例程返回一个基于 1 的数组。因此,数组是基于 0 的假设对我来说并不适用。此例程可以反转基于 0 或基于 1 的数组。我意识到最初的问题是反转字节数组,但同样的逻辑将适用。
Private Sub Reverse(ByRef s() As String, Optional ByVal base As Integer = 0)
Dim i As Long
Dim sSwap As String
For i = base To (UBound(s) + base) \ 2
sSwap = s(i)
s(i) = s((UBound(s) + base) - i)
s((UBound(s) + base) - i) = sSwap
Next
End Sub
【讨论】:
base,只需使用传入数组的LBound即可。