检查字符串是否“大多数”资本的快速方法

时间:2017-07-27 16:49:39

标签: c# string performance uppercase

我正在用C#编写一个用于聊天室的机器人,我想检测一条消息是否包含太多大写字母。如果邮件的总大写字母数超过其总邮件长度的one-third且邮件总长度大于13,则邮件包含太多大写字母。这是为了防止标记较小的消息。

现在我循环遍历每个角色并查看它是否为大写。这对于合理延长的消息很好。但是,如果您收到垃圾邮件发送者或巨魔,他们将不会总是发布合理延长的邮件。最大字符限制为2000,我无法更改此设置。使用我的方法,它开始停留在500+个字符周围。这为垃圾邮件发送者提供了足够的时间来粘贴邮件并再次发送,有效地淹没了聊天,同时机器人也在努力跟上。

我目前的代码:

bool isMostlyUpper = (message.Count(c => char.IsUpper(c)) >= message.Length * 0.3f) && message.Length > 13;

我无法将消息与string.ToUpper()进行比较,因为我仍然希望检测消息是否大多数是大写而不是全部大写。

有没有办法在不循环每个字符的情况下执行此操作?或者更快地获得结果的方法?我可以添加检查以查看消息是否为> 500,但有时会有500+条长消息可以通过。

有没有人有任何聪明的解决方案?感谢。

2 个答案:

答案 0 :(得分:2)

如果你在达到病情时突破你的环路,你会在某些情况下节省一些时间

int count = 0;
float maxLenght = message.Length * 0.3f;
bool isMostlyUpper = false;

foreach (char c in message)
{
    if (char.IsUpper(c))
    {
        count++;
    }

    if(count >= maxLenght)
    {
        isMostlyUpper = true;
        break;
    }

}

您还可以跟踪标记的最后一条消息,并将其与收到的新消息进行比较,这样就可以阻止人们发送同一条消息,并且您不必多次重新计算同一条消息。

答案 1 :(得分:0)

当邮件太长时开始跳过字符

[-1, 150, 190, 170, -1, -1, 160, 180]
[-1, 150, 160, 170, -1, -1, 180, 190]

使用更大的除数来测试更大部分的字符。

如果你认为一个非常智能的机器人可以欺骗你的算法,你也可以创建一个随机除数

private static bool IsMostlyUpper (string message)
{
    if (message.Length > 13) {
        int step = 1 + message.Length / 100; // integer division.
        // 1 for message length < 100
        // 2 for message length < 200
        // 3 for message length < 300

        int limit = message.Length / step / 3;
        int upperCase = 0;
        for (int i = 0; i < message.Length; i += step) {
            if (Char.IsUpper(message[i])) {
                upperCase++;
                if (upperCase >= limit) {
                    return true;
                }
            }
        }
    }
    return false;
}

使用

创建除数
private static Random _random = new Random(); // static field

但这只是节省几微秒的很多复杂功能!