Способ проверить повторяющиеся сообщения в строке? - PullRequest
1 голос
/ 22 сентября 2011

Точные сообщения не нужно беспокоиться о вариациях или символах между ними, сейчас я просто ищу эффективный способ проверки сообщений, подобных приведенным ниже.

У меня есть сообщение вроде:

string msg = "This is a small message !";

И я хотел бы проверить, было ли это сообщение отправлено несколько раз в одной и той же строке, например:

string msg = "This is a small message !This is a small message !";

или:

string msg = "This is a small message !This is a small message !This is a small message !";

или:

string msg = "This is a small message !This is a small message !This is a small message !This is a small message !This is a small message !";

У меня есть LinkedList<string>, в котором хранятся последние 3 полученных сообщения и наряду с этими последними 3 сообщениями я хотел бы сопоставить текущие сообщения, чтобы увидетьесли оно равно одному из текущих сообщений магазина или повторению любого.

foreach (string item in myListOfMessages)
{
    if (string.Equals(msg, item))
    {
        // the message matchs one of the stored messages
    }
    else if (msg.Lenght == (item.Lenght * 2) && string.Equals(msg, string.Concat(item, "", item)))
    {
        // the message is a repetition, and ofc only works when some one sends the message twice in the same string
    }
}

Как я показал в примерах, повторение может быть довольно большим, также я не уверен, что метод IПредставленное выше является лучшим для того, что мне нужно.Это была первая идея, которая пришла мне в голову, но вскоре после того, как я осознал, что таким образом будет проделано гораздо больше работы.

Ответы [ 4 ]

2 голосов
/ 22 сентября 2011

Линк на помощь:

string msg = "This is a small message !";
string otherMsg = "This is a small message !This is a small message !This is a small message !This is a small message !This is a small message !";

bool isRepeated = Enumerable.Range(0, otherMsg.Length / msg.Length)
                            .Select(i => otherMsg.Substring(i *  msg.Length,  msg.Length))
                            .All( x => x == msg);

Этот подход в основном берет подстроку длины первого сообщения и сравнивает каждый кусок с исходным сообщением.

Завернут в метод с некоторой предварительной проверкой:

public bool IsRepeated(string msg, string otherMsg)
{
    if (otherMsg.Length < msg.Length || otherMsg.Length % msg.Length != 0)
        return false;

    bool isRepeated = Enumerable.Range(0, otherMsg.Length / msg.Length)
                                .Select(i => otherMsg.Substring(i * msg.Length, msg.Length))
                                .All(x => x == msg);
    return isRepeated;
}

Edit:

Приведенный выше подход генерирует ненужные строки, которые нужно будет скопировать - гораздо более эффективное и быстрое решение:

public bool IsRepeated(string msg, string otherMsg)
{
    if (otherMsg.Length < msg.Length || otherMsg.Length % msg.Length != 0)
        return false;

    for (int i = 0; i < otherMsg.Length; i++)
    {
        if (otherMsg[i] != msg[i % msg.Length])
            return false;
    }
    return true;
}
1 голос
/ 22 сентября 2011
static void Main(string[] args)
        {
            string msg = "This is a small message !This is a small message !This is a small message !";
            string substring = "This is a small message !";

            string[] split = msg.Split(new string[] { substring }, StringSplitOptions.None);

            Console.WriteLine(split.Length - 1);

            foreach (string splitPart in split)
            {
                if (!String.IsNullOrEmpty(splitPart))
                    Console.WriteLine("Extra info");
            }
        }
1 голос
/ 22 сентября 2011
private int countRepeats(string msg, string item)
{
   if(string.Replace(msg, item).Length > 0)
      return 0;

   return msg.Length / item.Length;
}
1 голос
/ 22 сентября 2011

Вы можете попробовать использовать регулярное выражение

string msg = "This is a small message !";
string Input = "This is a small message !This is a small message !";

System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex(msg);
System.Text.RegularExpressions.MatchCollection Matches = r.Matches(Input);

int Count = Matches.Count; //Count = 2
...