主要是为了练习。 这是VB中的代码:
Private Function ScrambleWord(ByVal word As String) As String
Dim i As Integer = 0
Dim builder As System.Text.StringBuilder = New System.Text.StringBuilder()
Dim random As Random = New Random()
Dim index As Integer = 0
Dim lower As Integer = 0
Dim upper As Integer = 0
Dim parts() As Char
Dim part As Char
If Not (String.IsNullOrEmpty(word)) Then
If (word.Length > 3) Then
parts = word.ToCharArray()
builder.Append(word.Substring(0, 1))
parts = word.Substring(1, word.Length - 2).ToCharArray()
lower = LBound(parts) : upper = UBound(parts)
For i = lower To upper
index = random.Next(lower, upper)
part = parts(index)
parts(index) = parts(i)
parts(i) = part
Next
builder.Append(parts)
builder.Append(word.Substring(word.Length - 1, 1))
Return builder.ToString()
Else
Return word
End If
Else
Return String.Empty
End If
End Function
我使用了一个在线翻译网站并以此结束:
private string ScrambleWord(string word)
{
int i = 0;
StringBuilder builder = new StringBuilder();
Random random = new Random();
int index = 0;
int lower = 0;
int upper = 0;
char[] parts = null;
char part = '\0';
if (!(string.IsNullOrEmpty(word)))
{
if ((word.Length > 3))
{
parts = word.ToCharArray();
builder.Append(word.Substring(0, 1));
parts = word.Substring(1, word.Length - 2).ToCharArray();
lower = Information.LBound(parts);
upper = Information.UBound(parts);
for (i = lower; i <= upper; i++)
{
index = random.Next(lower, upper);
part = parts[index];
parts[index] = parts[i];
parts[i] = part;
}
builder.Append(parts);
builder.Append(word.Substring(word.Length - 1, 1));
return builder.ToString();
}
else
{
return word;
}
}
else
{
return string.Empty;
}
}
我不确定所有翻译是否都很好,但现在我得到两个错误,因为信息不存在于c#
中错误出现在C#代码的行上:
lower = Information.LBound(parts);
upper = Information.UBound(parts);
两个错误都是一样的:
当前上下文中不存在名称“信息”
我从this link获取了VB代码并尝试将其转换为c#
答案 0 :(得分:3)
Information class 来自Microsoft.VisualBasic namespace。
您可以添加对Microsoft.VisualBasic的引用,并将using Microsoft.VisualBasic
添加到文件的顶部。
答案 1 :(得分:3)
实际上,您在当前上下文中没有任何名为Information
的内容。 (在您发布的代码中没有声明任何内容,无论是在VB还是C#中。)
无论如何你根本不需要它。它被用来访问parts
数组的边界,你已经知道它们了。您首先使用它们来创建数组。 (并且您不需要VisualBasic
命名空间。)
parts = word.Substring(1, word.Length - 2).ToCharArray();
lower = 0;
upper = parts.Length; // Note this is one higher than the last index,
// because the first index is zero
for (i = lower; i < upper; i++) // So use < rather than <= here
{
// Other code here.
}
VB中需要 LBounds
和UBounds
,因为数组并不总是必须从某个索引开始,因为@competent_tech在评论中提到。可以声明具有不同索引的数组,甚至是负数(例如,Dim parts(-3 To 3)
)。此外,VB中的所有内容都是变体,因此数组可以是任何类型或多维,并且编译器不能总是将它们分开。 (例如,在Range
中从Excel中检索单元格 - 结果可以是一个单元格,整行,或矩形或方形单元格块。)这里不需要它们,因为您知道{{1只是一维字符数组。 C#中的数组从索引0开始,并且有一个方法来检索数组的长度。数组的最后一个索引比该长度少一个,因为上面的代码用注释表示。
答案 2 :(得分:2)
更改您的代码:
而不是
lower = Information.LBound(parts);
upper = Information.UBound(parts);
把
lower = parts.GetLowerBound(0);
upper = parts.GetUpperBound(0);
信息类特定于VB;在编写C#代码时 你必须使用等价物:
Information.LBound(value) == value.GetLowerBound(0);
Information.UBound(value) == value.GetUpperBound(0);
答案 3 :(得分:0)
这就是我提出的:
private static string ScrambleWord(string word)
{
// easy exits come first
if (string.IsNullOrEmpty(word))
return String.Empty;
if (word.Length <= 3)
return word;
// now do the work
StringBuilder builder = new StringBuilder();
Random rand = new Random();
builder.Append(word.Substring(0, 1));
List<Char> parts = word.Substring(1).ToList();
while (parts.Count() > 0)
{
int upper = parts.Count();
int index = rand.Next(0, upper);
builder.Append(parts[index]);
parts.RemoveAt(index);
}
return builder.ToString();
}
熟悉C#的人可能会指出错误。