如何将代码从VB转换为C#?

时间:2013-06-29 18:19:13

标签: c# .net vb.net vb.net-to-c#

主要是为了练习。 这是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#

4 个答案:

答案 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中需要

LBoundsUBounds,因为数组并不总是必须从某个索引开始,因为@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#的人可能会指出错误。