我正在用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+
条长消息可以通过。
有没有人有任何聪明的解决方案?感谢。
答案 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
但这只是节省几微秒的很多复杂功能!