Подсчитывать пары начальных и завершающих символов в строке?

#c# #.net #.net-4.0 #string-search

#c# #.net #.net-4.0 #строка-поиск

Вопрос:

Допустим, у меня есть строка:

Ты красивая < леди > , но эта < девушка > < красивее > тебя.

Извините за английский, но как я могу посчитать, сколько <> в приведенном выше тексте?

Я знаю, что мог бы сделать:

 int count = message.Length - message.Replace("<", "").Replace(">", "").Length;
 

Но это будет учитываться, даже если текст был таким:

Привет <<<< , ты <<<<< как поживаешь >>>

Когда на самом деле я просто хочу подсчитать пары <>, чтобы счетчик увеличивался на единицу, когда он находит начальные < и конечные>, и должен начинать подсчет только тогда, когда < найден.

Комментарии:

1. в этом случае <<<>>> результат должен указывать 1 или 3?

2. Следует ли считать 1, потому что каждый <> работает только для одного содержимого, поэтому, когда вы используете его несколько раз внутри одного, он не превратится ни во что другое, но если у вас есть <<<>>> asdas <> , тогда он должен считать 2

Ответ №1:

Как насчет того, чтобы сделать это так. В принципе, вы должны считать> только в том случае, если вы когда-то сталкивались с < . Или сказать по-другому. Вы складываете <, а затем используете по одному из них, когда сталкиваетесь с > .

 string test = "You are pretty <lady> but that <girl> is prettier <than> you.";

int startcount = 0;
int paircount = 0;
foreach( char c in test ){
  if( c == '<' )
    startcount  ;
  if( c == '>' amp;amp; startcount > 0 ){
    startcount--;
    paircount  ;
  }
}
//paircount should now be the value you are after.
 

Редактировать

Я подумал, что <<<>>> должно быть 3, а не 1, поэтому вам нужно быстрое исправление выше. Чтобы считать <<<>>> только как 1, измените на это

 string test = "You are pretty <lady> but that <girl> is prettier <than> you.";

bool foundstart = false;
int paircount = 0;
foreach( char c in test ){
  if( c == '<' )
    foundstart = true;
  if( c == '>' amp;amp; foundstart ){
    foundstart = false;
    paircount  ;
  }
}
//paircount should now be the value you are after.
 

Комментарии:

1. 1. Но следует отметить, что это будет считаться you are <so <pretty>> lady как два, которые могут быть или не быть тем, чего хочет OP.

2. конечно, это легко исправить, увеличиваясь только paircount тогда, когда startcount равен нулю.

3. Oyvind спасибо за ответ есть ли способ сделать это короче с помощью linq или это не будет стоить по сравнению с эффективностью foreach?

4. Исак Саво — Должно быть исправлено моей правкой до того, как вы разместили свои комментарии. Все еще проблемы с подходом?

5. Prix — Как бы я ни любил LINQ, не все задачи подходят для LINQ. Я уверен, что вы можете сделать это с помощью LINQ (возможно, с помощью Aggregate), но код будет более сложным и нечитаемым (а также менее производительным, но это, вероятно, не имеет значения, если у вас нет гигантской строки). LINQ имеет много используемых, но это не один из них, IMO.

Ответ №2:

Как насчет:

 int count = b.Split('<').Count(t => t.Contains('>'));
 

Ответ №3:

попробуйте это.

         string test = "You are pretty <<<lady>>> but that <girl> is prettier <than> you.";

        int found = 0;
        int count = 0;
        for (int i = 0; i < test.Length; i  ) {

            if (test[i] == '<')
            {
                found  ;
            }
            else if (test[i] == '>'amp;amp;found!=1)
            {
                found--;
            }
            else if (test[i] == '>'amp;amp;found==1) {
                count  ;
                found = 0;

            }else continue;

        }
        return count;