首页 > 解决方案 > 检查字符是否为符号的意外结果

问题描述

我正在创建一个字符串扩展来检查一个字符串是否都是符号,但是它没有像我期望的那样工作,到目前为止我有以下内容:

// Class for: String extensions
public static class StringExtension
{
    // Method for: Determining if a string contains only symbols
    public static bool ContainsOnlySymbols(this String inputString)
    {
        // Identifiers used are:
        bool containsMore = false;

        // Go through the characters of the input string checking for symbols
        foreach (char character in inputString.ToCharArray())
        {
            // This line needs || Char.IsPunctuation(character) also 
            // Credit: @asantaballa
            containsMore = Char.IsSymbol(character) ? false : true;
            if (containsMore)
            {
                return containsMore;
            }
        }

        // Return the results
        return containsMore; // Edited after answer: <-- mistake here
    }
}

现在,如果我在以下两个字符串上使用此扩展名,我会得到与我期望看到的相反的结果:

string testString = "!=";

我希望这都是符号,但是

I expect: testString.ContainsOnlySymbols() => true
I get:    testString.ContainsOnlySymbols() => false

现在,如果我使用下一个测试字符串:

string testString = "Starts with";

我希望这没有符号

I expect: testString.ContainsOnlySymbols() => false
I get:    testString.ContainsOnlySymbols() => true

标签: c#.netstringchar

解决方案


几个问题:

在您的循环中,您实际上只能获得与最后一个字符相关的选项。And or 子句应该照顾它。

containsMore = containsMore || !(Char.IsSymbol(character) || Char.IsPunctuation(character));

然后,你需要一个 not 结尾。如果它不包含更多,那么它的唯一符号

return ! containsMore;

您可能还需要一个特殊情况来处理空字符串。不知道你想如何处理。如果空字符串应该返回 true 或 false,那将是您的选择。

您可以使用单线来完成此操作。请参阅这些示例。

        string x = "@#=";
        string z = "1234";
        string w = "1234@";

        bool b = Array.TrueForAll(x.ToCharArray(), y => (Char.IsSymbol(y) || Char.IsPunctuation(y))); // true
        bool c = Array.TrueForAll(z.ToCharArray(), y => (Char.IsSymbol(y) || Char.IsPunctuation(y))); // false
        bool e = Array.TrueForAll(w.ToCharArray(), y => (Char.IsSymbol(y) || Char.IsPunctuation(y))); // false

推荐阅读