VB.NET 到 C# 禁止字符数组

VB.NET to C# Array of banned characters

我在 VB.NET 中有这个禁止字符数组,我该如何转换它?

原始 VB.NET 禁用字符:

Public BannedChars() As String = New String() {" ", ",", ".", ";", "/", "\", "!", """", "(", ")", "£", "$", "%", "^", "&", "*", "{", "}", "[", "]", "@", "#", "'", "~", "<", ">", "?", "+", "=", "-", "|", "¬", "`"}

尝试了 C# 禁止字符但没有用:

public string[] BannedChars = new string[] {" ", ",", ".", ";", "/", "\", "!", """", "(", ")", "£", "$", " % ", " ^ ", " & ", " * ", "{ ", "}", "[", "]", "@", "#", "'", "~", "<", ">", "?", "+", "=", "-", "|", "¬", "`"};

错误:

CS1003  C# Syntax error, ',' expected

CS0623  C# Array initializers can only be used in a variable or field initializer. Try using a new expression instead.

CS0023  C# Operator '!' cannot be applied to operand of type 'string'

CS1056  C# Unexpected character '£'

CS0019  C# Operator '%' cannot be applied to operands of type 'string' and 'string'

CS0019  C# Operator '*' cannot be applied to operands of type 'string' and 'string'

感谢任何帮助! 谢谢 C.

你的问题是含糊一个。如果您想要 个字符 的数组,请使用 char,而不是 string 类型:

  public char[] BannedChars = new char[] {
    ' ', ',', '.', ';', '/', '\', '!', '\'', '(', ')', '£', '$', 
    '%', '^', '&', '*', '{', '}', '[', ']', '@', '#', '"', 
    '~', '<', '>', '?', '+', '=', '-', '|', '¬', '`'};

escapement 是另一个问题:在 C# 中,我们为此使用 \

    '\', '\''

如果您需要单个 字符串(可以将其视为只读字符数组):

 public string BannedChars = new string(new char[] {
    ' ', ',', '.', ';', '/', '\', '!', '\'', '(', ')', '£', '$', 
    '%', '^', '&', '*', '{', '}', '[', ']', '@', '#', '"', 
    '~', '<', '>', '?', '+', '=', '-', '|', '¬', '`'});

最后,如果你想要字符串数组

 public string[] BannedChars = new string[] {
    " ", ",", ".", ";", "/", "\", "!", "'", "(", ")", "£", "$", 
    "%", "^", "&", "*", "{", "}", "[", "]", "@", "#", "\"", 
    "~", "<", ">", "?", "+", "=", "-", "|", "¬", "`"});

请再次注意擒纵机构(例如,我们不会双重转义引号:不是 """",而是 "\""):

 "\", "\""

编辑: 如果你要检查一个字符串是否包含任何被禁止的字符,我建议使用 HashSet<char> 而不是数组:

 // static : you have just one set of banned char, don't you?
 public static readonly HashSet<char> BannedChars = new HashSet<char>() {
    ' ', ',', '.', ';', '/', '\', '!', '\'', '(', ')', '£', '$', 
    '%', '^', '&', '*', '{', '}', '[', ']', '@', '#', '"', 
    '~', '<', '>', '?', '+', '=', '-', '|', '¬', '`' 
 }; 

 ...

 string Mytext = @"some string with many characters: 'a', 'b'; which can be banned...";

 if (MyText.Any(c => BannedChars.Contains(c))) {
   // At least one Banned char has been found...
 }

我在这里可以很清楚地看到问题,但情况可能并非总是如此,所以请在以后提供更好的描述。

在这种情况下,问题在于转义。在 VB 中,double-quote 是唯一需要在文字字符串中转义的字符,这是通过另一个 double-quote 完成的。 C# 支持许多转义序列,反斜杠是转义字符。这意味着你用反斜杠转义 double-quote 并且你还需要用另一个反斜杠转义反斜杠,例如

string[] arr = new[] {"\", "\""};

我认为这应该可以解决您的问题,但我们会在解决该问题后看看是否还会出现其他问题。

C#使用小写关键字,所以将Public改为publicNew改为new

C# 将类型放在变量而不是 As 子句之前,因此删除 As 并将 String 移到 BannedChars.

之前

C# 对数组使用方括号而不是圆括号,因此将 () 替换为 []

C# puts 在类型中而不是在变量之后使用括号声明数组类型(遗留 VB),因此在 String.

之后放置 []

C# 允许省略数组初始值设定项的基类型,而不是像 VB 那样需要整个类型或将其与 new 关键字一起完全省略,因此从中删除 String初始化程序。

C# 字符串文字有多种形式。最接近 VB 的称为逐字字符串,它们以 @" 开头,以 " 结尾,字面量 " 就像 VB 那样,所以把 @ 每次开场前 ".

C# 用分号终止语句,而 VB 不(这是最简单的说法),所以附加一个 ;.

public String[] BannedChars = new [] {
    @" ", @",", @".", @";", @"/", @"\", @"!", @"""", @"(", @")", 
    @"£", @"$", @"%", @"^", @"&", @"*", @"{", @"}", @"[", @"]", 
    @"@", @"#", @"'", @"~", @"<", @">", @"?", @"+", @"=", @"-", 
    @"|", @"¬", @"`" };

.NET 数据类型(适用于 Java、Java脚本、...)

至于什么是字符:String 包含零个或多个字符。 Char 占一个字符,一半甚至更少。 Char 是一个 UTF-16 编码单元。 String是一个计数序列的UTF-16编码单元。一个或两个 UTF-16 代码单元代表一个 Unicode 代码点。字素簇是一个基本代码点的序列,后跟一系列组合代码点。文本呈现显示字素簇;用户称他们为字符。一些代码点是 "composed" 因为它们旨在表示与具有特定组合代码点的不同基本代码点相同的东西。这使得比较字符串变得相当困难。因此,Unicode 库提供规范化函数来组合或分解 "composed" 个代码点。

因此,对于您的代码而言,字符串数组似乎是一个不错的选择,尤其是因为这是原始代码所使用的。