如何测试字符串中的某些符号?(C#)

如何测试字符串中的某些符号?(C#),c#,C#,作为大学项目的一部分,我正在尝试为自己的语言制作一个编译器,在编写模块以确定字符串中输入的类型(字母、数字、分隔符等)时遇到了这个问题 当我到达第一个if语句时,它返回以下错误: mscorlib.dll中发生类型为“System.ArgumentException”的未处理异常 附加信息:对象必须是Char类型 我不知道如何解决这个问题,因为我使用char进行测试,不知道错误所指的是哪个对象 感谢阅读,非常感谢您的帮助^ ^因为您使用了字符串的引号,所以出现了错误。使用单引号 String s

作为大学项目的一部分,我正在尝试为自己的语言制作一个编译器,在编写模块以确定字符串中输入的类型(字母、数字、分隔符等)时遇到了这个问题

当我到达第一个if语句时,它返回以下错误: mscorlib.dll中发生类型为“System.ArgumentException”的未处理异常

附加信息:对象必须是Char类型

我不知道如何解决这个问题,因为我使用char进行测试,不知道错误所指的是哪个对象


感谢阅读,非常感谢您的帮助^ ^

因为您使用了字符串的引号,所以出现了错误。使用单引号

String s = "String";
char c = 'c';

您得到错误是因为您使用了字符串的引号。使用单引号

String s = "String";
char c = 'c';

在双引号“asdf…”之间写入的任何内容都是字符串文字。 如果需要字符文字,请使用单引号
'a'

private static void readChar(ref string sentence, ref int inputType)
{
    foreach (char test in sentence)
    {

        if ((test.CompareTo('|') == 0) |
            (test.CompareTo('*') == 0) |
            (test.CompareTo('/') == 0) |
            (test.CompareTo('+') == 0) |
            (test.CompareTo('-') == 0) |
            (test.CompareTo('@') == 0) |
            (test.CompareTo('#') == 0) |
            (test.CompareTo('$') == 0) |
            (test.CompareTo('%') == 0) |
            (test.CompareTo('^') == 0) |
            (test.CompareTo('&') == 0) |
            (test.CompareTo('(') == 0) |
            (test.CompareTo(')') == 0) |
            (test.CompareTo(',') == 0) |
            (test.CompareTo('`') == 0) |
            (test.CompareTo('=') == 0))
        {
            ......

在双引号“asdf…”之间写入的任何内容都是字符串文字。 如果需要字符文字,请使用单引号
'a'

private static void readChar(ref string sentence, ref int inputType)
{
    foreach (char test in sentence)
    {

        if ((test.CompareTo('|') == 0) |
            (test.CompareTo('*') == 0) |
            (test.CompareTo('/') == 0) |
            (test.CompareTo('+') == 0) |
            (test.CompareTo('-') == 0) |
            (test.CompareTo('@') == 0) |
            (test.CompareTo('#') == 0) |
            (test.CompareTo('$') == 0) |
            (test.CompareTo('%') == 0) |
            (test.CompareTo('^') == 0) |
            (test.CompareTo('&') == 0) |
            (test.CompareTo('(') == 0) |
            (test.CompareTo(')') == 0) |
            (test.CompareTo(',') == 0) |
            (test.CompareTo('`') == 0) |
            (test.CompareTo('=') == 0))
        {
            ......

CompareTo
方法接受一个char进行比较。您正在传入一个字符串。

'char'

使用单引号对
字符串
使用双引号
比较方法接受字符进行比较。您正在传入一个字符串。


'char'
使用单引号
字符串使用双引号

private static void ReadChar(string sentence, ref int inputType)
{
    foreach (char test in sentence) {
        if ("|*/+-@#$%^&(),`=".Contains(test)) {
            inputType = 5;
        } // delimiter
        else if (Char.IsDigit(test)) {
            inputType = 3;
        } // numeric              
        else if (Char.IsWhiteSpace(test)) {
            inputType = 6;
        } // space
        else if (test == ';') {
            inputType = 7;
        } // semicolon          
        else {
            inputType = 1;
        } // end alpha
    }
}

只是一个简单的建议:

private static void ReadChar(string sentence, ref int inputType)
{
    foreach (char test in sentence) {
        if ("|*/+-@#$%^&(),`=".Contains(test)) {
            inputType = 5;
        } // delimiter
        else if (Char.IsDigit(test)) {
            inputType = 3;
        } // numeric              
        else if (Char.IsWhiteSpace(test)) {
            inputType = 6;
        } // space
        else if (test == ';') {
            inputType = 7;
        } // semicolon          
        else {
            inputType = 1;
        } // end alpha
    }
}

您可以使用Char.IsDigit('9')
可以使用双“| |”,单“|”没有意义。为什么字符串参数
ref
?在循环中多次更新
ref int
参数有什么用?是否有任何东西试图以同样快的速度读取这个int变量?一个想法是
切换(测试){…}
,然后为每个“输入类型”(
5
3
6
,等等)设置一个切换块(每个块上都有许多
大小写
)。谢谢你的建议。对C#还是很陌生,所以要习惯它。你可以使用
Char.IsDigit('9')
可以使用双“| |”,单“|”没有意义。为什么字符串参数
ref
?在循环中多次更新
ref int
参数有什么用?是否有任何东西试图以同样快的速度读取这个int变量?一个想法是
切换(测试){…}
,然后为每个“输入类型”(
5
3
6
,等等)设置一个切换块(每个块上都有许多
大小写
)。谢谢你的建议。对C还是比较陌生,所以还是习惯吧。最好在两个
char
值之间使用
=
.CompareTo
用于常规排序,而不是相等检查。最好在两个
char
值之间使用
=
.CompareTo
用于常规排序,而不是相等检查。
“|*/+-@$%^&(),`=“.Contains(test)
经过Linq(并使用
字符串实现
IEnumerable
)的事实),因此不要忘记使用System.Linq指令。为了避免Linq,您可以说
“|*/+-@$%^&(),`=“.IndexOf(test)!”-1
,但Linq很好。
“|*/+-@$%^&(),`=“.Contains(test)
通过Linq(并使用
string
实现
IEnumerable
)的事实),所以不要忘记使用System.Linq指令。为了避免Linq,您可以说
“|*/+-@$%^&(),`=“.IndexOf(test)!”-1
,但Linq很好。