-2

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

两个错误都是一样的:

当前上下文中不存在名称“信息”

我从此链接获取了 VB 代码并尝试将其转换为 c#

4

4 回答 4

3

Information 类来自Microsoft.VisualBasic 命名空间 。

您可以添加对 Microsoft.VisualBasic 的引用并添加using Microsoft.VisualBasic到文件顶部。

于 2013-06-29T20:59:29.803 回答
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.
}

LBounds并且UBounds在 VB 中是必需的,因为数组并不总是必须从某个索引开始,正如@competent_tech在评论中提到的那样。可以声明具有不同索引的数组,甚至是负数(例如,Dim parts(-3 To 3))。此外,VB 中的所有内容都是变体,因此数组可以是任何类型或多维的,编译器无法始终将它们区分开来。(例如,从 Excel 中检索单元格Range- 结果可以是一个单元格、一整行或一个矩形或方形单元格块。)这里不需要它们,因为你知道parts只是一个一维字符数组。C# 中的数组从索引零开始,并且有一种方法可以检索数组的长度。数组的最后一个索引比该长度小一,正如我上面的代码用注释指出的那样。

于 2013-06-29T21:11:45.893 回答
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);  
于 2013-06-29T21:08:07.530 回答
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# 的人可能会指出错误。

于 2013-06-29T22:25:17.377 回答