【问题标题】:What is the best way to compare 2 characters ignoring case in C#?在 C# 中比较忽略大小写的 2 个字符的最佳方法是什么?
【发布时间】:2018-02-10 00:50:58
【问题描述】:

我正在使用控制台应用程序制作密码验证方法,但在比较两个字符时遇到了困难。有没有办法在不使用 toUpper()toLower() 方法的情况下比较两个字符。 例如,如果我正在比较这两个字符

 char c1 = 'a', c2 = 'A';

        bool result = c1.Equals(c2);

我希望结果为 true

我尝试过使用 toLower() 方法,但我遇到了问题。

这是我的密码验证方法。

  private static bool PasswordValidation(string input)
    {        
        if(!(input.Length>=8&&input.Length<=15))
        {
            Console.WriteLine("min 8 characters max 15");
            return false;
        }

        int specialCharacters = 0, uppLatter = 0, lowerLatter = 0;
        char[] charArray = input.ToCharArray();

        for (int i = 0; i < charArray.Length; i++)
        {
            char ch = charArray[i];
            if (char.IsWhiteSpace(ch))
            {
                Console.WriteLine("can't use space in password");
                return false;
            }

            if (!char.IsLetterOrDigit(ch))              
                specialCharacters++;

            if (char.IsUpper(ch))
                uppLatter++;

            if (char.IsLower(ch))
                lowerLatter++;

            if (i < charArray.Length - 1)
            {

                if (char.ToLower(charArray[i])==char.ToLower(charArray[++i]))
                {
                    Console.WriteLine("same characters");
                    return false;
                }

                if(char.IsDigit(charArray[i])&&char.IsDigit(charArray[++i]))
                {
                    int sum = Convert.ToInt32(charArray[i]) + Convert.ToInt32(charArray[++i]);
                    if(sum==input.Length)
                    {
                        Console.WriteLine("sum is equal to length");
                        return false;
                    }
                }
            }

        }

        if (specialCharacters == 0)
        {
            Console.WriteLine("at lesast one special character is required");
            return false;
        }
        if (uppLatter == 0)
        {
            Console.WriteLine("at lesast one upper latter is required");
            return false;
        }
        if (lowerLatter == 0)
        {
            Console.WriteLine("at lesast one lower character is required");
            return false;
        }


        var repeats = input.GroupBy(s1 => s1)
            .Where(s1 => s1.Count() > 3)
            .Select(s1 => s1).ToArray();

        if (repeats.Length > 0)
        {
            Console.WriteLine("one character can't be repeted more than 3 times");
            return false;
        }
        return true;
    }

如您所见,我使用整数来计算大小写字母以及特殊字符的数量,但这仅适用于 input 字符串的第一个字符。 我一打到这个

if (char.ToLower(charArray[i])==char.ToLower(charArray[++i]))

一行代码,乱七八糟。

任何建议都有帮助。 感谢您的宝贵时间。

【问题讨论】:

  • 如果条件成立或不成立,你总是递增 i if (char.ToLower(charArray[i])==char.ToLower(charArray[++i])) 改变你的逻辑,不要递增循环体中的循环索引(顺便说一句:你的意思是@987654325 @)
  • @L.B 坦克你的答案,但它不会有太大变化,因为我在增量之前使用 toLower() 函数。也许我应该把 else 语句和减量 i (i--)。
  • 我不确定您所说的“所有地狱都崩溃了”是什么意思。一般来说,描述行为比用模糊的结论总结要好。你的意思是你的循环迭代不正确吗?也许你应该使用char.ToLower(charArray[i])==char.ToLower(charArray[i+1])(带有适当的边界检查)。
  • 离题:永远不要强制用户遵守这些令人毛骨悚然的密码规则。为什么将密码长度限制为 15?为什么要看到特殊字符?我使用 16 个字符长度的密码,只有小写字母和数字,这比典型的 8 字符密码强得多。
  • @AndreyNasonov 这是我的同事对我想用来练习的工作申请的测试,所以这些是要求,但谢谢你的建议:D。

标签: c# arrays for-loop if-statement char


【解决方案1】:

你可以这样做:

char c1 = 'a', c2 = 'A';

bool result = String.Equals(c1.ToString(), c2.ToString(), StringComparison.OrdinalIgnoreCase);

【讨论】:

  • 谢谢,这行得通。我这里用过 if(String.Equals(charArray[i].ToString(),charArray[i+1].ToString(), StringComparison.OrdinalIgnoreCase))
猜你喜欢
  • 1970-01-01
  • 2010-11-26
  • 2020-12-31
  • 2016-01-29
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
相关资源
最近更新 更多