将PHP转换为C#-如何处理数组


Convert PHP to C# - how to handle arrays?

我需要将几行PHP代码转换为C#。然而,我只有基本的知识,我还不太了解数组。

这是我需要转换为C#的代码:

function decode_char($c, $a1, $a2)
{
  $result = $c;
  for($j = 0; $j < count($a1); $j++) {
    if ($c == $a1[$j][0]) {
      $result = $a2[$j][0];
      break;
    }
    if ($c == $a2[$j][0]) {
      $result = $a1[$j][0];
      break;
    }
  }
  return $result;
}
function decode_str($s)
{
  $a1 = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "W", "G", "X", "M", "H", "R", "U", "Z", "I", "D", "=", "N", "Q", "V", "B", "L");
  $a2 = array("b", "z", "a", "c", "l", "m", "e", "p", "s", "J", "x", "d", "f", "t", "i", "o", "Y", "k", "n", "g", "r", "y", "T", "w", "u", "v");
  $result = '';
  for($i = 0; $i < strlen($s); $i++) {
    $result .= decode_char($s[$i], $a1, $a2);
  }
  $result = base64_decode($result);
  return $result;
}

到目前为止,我得到的是:

public string decode_str(string s)
{
       string[] a1 = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "W", "G", "X", "M", "H", "R", "U", "Z", "I", "D", "=", "N", "Q", "V", "B", "L" };
       string[] a2 = { "b", "z", "a", "c", "l", "m", "e", "p", "s", "J", "x", "d", "f", "t", "i", "o", "Y", "k", "n", "g", "r", "y", "T", "w", "u", "v" };
       string result = "";
       for (int i = 0; i < s.Length; i++)
       {
           result += decode_char(s[i], a1, a2);
       }
           return result;
}

有人能帮助转换decode_char吗?

感谢您的快速回答。我自己已经做了,但使用了字符串而不是字符,所以明天我将在修改代码时接受答案

这应该相当于decode_char

public char decodeChar(char c, string[] a, string[] a2)
{
    for(var j = 0; j < a.Length; j++)
    {
        if(c == a1[j])
            return a2[j];
        if(c == a2[j])
            return a1[j];
    }
    return c;
}

我将尝试重写decode_char;没那么难。。。

public char decode_char(char input, string[] array1, string[] array2)
{
  var result = input;
  for(var j = 0; j < array1.Length; j++) 
  {
    if (input == array1[j][0]) {
      result = array2[j][0];
      break;
    }
    if (input == array2[j][0]) {
      result = array1[j][0];
      break;
    }
  }
  return result;
}

这将适用于您已经拥有的内容。但是,我认为还有改进的余地。在C#中,字符和字符串之间存在语义差异[1]。如果您将数组定义为字符数组,而不是字符串数组,那么它们就不必是"二维"的;您可以简单地引用字符的索引,而不是给定索引处字符串的第一个字符的索引。

在C#中,通常也不应该将+=与字符串一起使用。字符串是不可变的;创建一个实例,如果它被更改,则创建一个新实例,并且变量所持有的引用被移动到该新实例;旧实例然后一直挂起,直到GCed。结果是,每个+=操作都会创建一个全新的字符串,除了一个之外,所有这些字符串几乎都立即无用,这是对内存的浪费。相反,有一个名为StringBuilder的类可以减少这种"颠簸"并节省内存:

此外,定义一个空字符串文字也是一种糟糕的做法。它被创建为一个常量,唯一的,与所有其他定义的文字分离,再次浪费内存。String类上可用的String.Empty常量是一个集中变量,表示空字符串文本。

最后,C#的最佳实践建议用描述性的方式命名变量。C、 S、A1和A2不是很好的标识符。

public string decode_str(string input)
{
       char[] array1 = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'W', 'G', 'X', 'M', 'H', 'R', 'U', 'Z', 'I', 'D', '=', 'N', 'Q', 'V', 'B', 'L' };
       char[] array2 = { 'b', 'z', 'a', 'c', 'l', 'm', 'e', 'p', 's', 'J', 'x', 'd', 'f', 't', 'i', 'o', 'Y', 'k', 'n', 'g', 'r', 'y', 'T', 'w', 'u', 'v' };
       StringBuilder result = new StringBuilder(String.Empty);
       for (int i = 0; i < input.Length; i++)
       {
           result.Add(decode_char(input[i], array1, array2));
       }
       return result.ToString();
}

最后,C#有一些PHP显然没有的额外技巧,可以让你的decode_char函数更加简洁:

public char decode_char(char input, char[] array1, char[] array2)
{
  return array1.Contains(input) 
     ? array2[array1.IndexOf(input)]
     : array2.Contains(input)
        ? array1[array2.IndexOf(input)];
        : input;         
}

试试这个:

char decode_char(char c, string a1, string a2)
{
    for (int i = 0; i < a1.Length; i++)
    {
        if (c == a1[i]) return a2[i];
        if (c == a2[i]) return a1[i];
    }
    return c;
}
string decode_str(string s)
{
    const string a1 = "0123456789WGXMHRUZID=NQVBL";
    const string a2 = "bzaclmepsJxdftioYkngryTwuv";
    StringBuilder sb = new StringBuilder();
    foreach (char c in s)
        sb.Append(decode_char(c, a1, a2));
    return DecodeFrom64(sb.ToString());
}
string DecodeFrom64(string encodedData)
{
    byte[] encBytes = Convert.FromBase64String(encodedData);
    return Text.Encoding.Unicode.GetString(encBytes);
}

很简单:

String DecodeChar(char c, string[] a1, string[] a2) {
  for(int i=0; i<a1.length; ++i) {
    if(a1[i] == c) return a2[i];
    if(a2[i] == c) return a1[i];
  }
  return c;
}

或:

String DecodeChar(char c, string[] a1, string[] a2) {
  var a1Id = Array.IndexOf(a1.ToCharArray(), c);
  var a2Id = Array.IndexOf(a2.ToCharArray(), c);
  if(a1Id != -1 && a1Id < a2Id) return a2[a1Id];
  if(a2Id != -1 && a2Id < a1Id) return a1[a1Id];
  return c;
}