0

これは私のvb.netコードです:

  Private Function PartOK(ByVal sPart As String) As Boolean
    Dim sCheck As String
    sCheck = "1234567890"
    PartOK = False
    sPart = Trim(sPart)

    If (Len(sPart) = PART_LENGTH) Or (IsNumeric(sPart)) Then
        Select Case sPart
            Case New String("1", PART_LENGTH), New String("2", PART_LENGTH), New String("3", PART_LENGTH)
            Case New String("4", PART_LENGTH), New String("5", PART_LENGTH), New String("6", PART_LENGTH)
            Case New String("7", PART_LENGTH), New String("8", PART_LENGTH), New String("9", PART_LENGTH)
            Case New String("0", PART_LENGTH), Left(sCheck, PART_LENGTH), Left(StrReverse(Left(sCheck, PART_LENGTH)), PART_LENGTH)
            Case Else : PartOK = True
        End Select
    End If
End Function

この関数は c# に変換しました。しかし、スイッチのケースがわかりませんでした。

あなたはそれを説明できますか?

4

2 に答える 2

4

これは、難読化されたコード オブ ザ イヤー賞の強力な候補です。C# のswitchステートメントには、VB.NET の Select ステートメントとほぼ同じ柔軟性がないため、直接変換することはできません。この場合、優れた高速な代替手段は HashSet です。次のようになります (PART_LENGTH が 5 であると仮定)。

    private static HashSet<string> badParts = new HashSet<string> { 
        "00000", "11111", "22222", "33333", "44444", "55555", 
        "66666", "77777", "88888", "99999", "01234", "98765" 
    };

PART_LENGTH が 10 でない場合、元のコードの Left() ケースはおそらくバグであることに注意してください。コードを記述して埋めたいと思うことは間違いありませんが、何が拒否されているかをより明確にするために、このように残しました。次に、文字列のテストは次のようになります。

    public static bool PartOK(string part) {
        long partNumber;
        if (part.Length != badParts[0].Length) return false;
        if (!long.TryParse(part, out partNumber)) return false;
        if (badParts.Contains(part)) return false;
        return true;
    }
于 2012-05-19T09:37:08.177 に答える
2

この関数は c# に変換しました。しかし、スイッチのケースがわかりませんでした。

C# に変換しようとしたときに、エラーが発生したという意味だと思います。変換されたコードとエラーを確認できれば便利でしたが、気にしないでください... VB コードが Option Strict On でコンパイルされていないことも役に立ちません。

C# では、case式はコンパイル時の定数である必要があり、範囲や複数の値を直接指定することはできません (複数のケースを指定します)。基本的に、C# の switch/case ステートメントは VB よりも制限的です。

コードが何を達成しようとしているのかは完全には明らかではありませんが、C# では、ほとんどの場合、代わりに if/else ステートメントを使用する必要があります。または、単一の式でも:

// Names changed for sanity. You could use the VB IsNumeric function, or
// consider *exactly* what you want - int.TryParse, long.TryParse or
// decimal.TryParse may be appropriate. Also note that I've changed your "Or"
// into an "And" as that's the only thing that makes sense...
return part.Length == ValidPartLength && 
       IsNumeric(part)) &&
       part != new string(part[0], ValidPartLength) &&
       part != "1234567890".Substring(0, ValidPartLength) &&
       part != "0987654321".Substring(0, ValidPartLength);
于 2012-05-19T09:00:00.683 に答える