2014-02-21 4 views
-1

я следующий код:Еогеасп: (?) переменная цикла не может быть изменен после присвоения

string STR = "AA ABC AA AA ABC aa aa aa AA" ; //declare string 

Regex rx = new Regex(@"AA"); // declare regular expression 

MatchCollection matches = rx.Matches(STR); // find matches in STR 

foreach (Match match in matches) 
{ 
    // perform sub-string operations that changes the original string 
    STR = "AA AA ABC aa aa aa AA" // substring operation which arbitrary changes the string 

    matches = rx.Matches(STR); // perform matching operation again 
    // because original string is changed 

    // ERROR : 'matches' in for loop is not changed (?) 

    // Question: how can I change 'matches' in for loop, thus it will start 
    // to work in new modified string ?  
} 

Может кто-нибудь помочь мне решить выше?

EDIT:

int j = 15 
for (int i = 0 to j){ 

// change both i and j value arbitrarily 

i = 100 
j = 102 

changes is reflected in original for loop 
} 

В первом случае я хочу, чтобы изменить отражение. Однако изменения в «совпадениях» не отражаются в цикле foreach. Это проблема. Как его решить?

+0

в 'for' петли вы можете изменить, но вы используете' foreach' – Grundy

+0

Изменить код, чтобы быть 'function', который принимает в строке (ваш' STR'), и когда вы хотите изменить ' match', вызовите эту функцию с новой строкой. – NoLifeKing

+0

Изменение коллекции foreach неверно, но ваш код работает для меня отлично. Новое значение присваивается совпадениям четыре раза. – nima

ответ

0

Вы не должны изменять объект, который вы сейчас итерируете: сначала создайте копию исходного объекта, а затем примените изменения к копии.

1

Вы перечислите более matches, так что если вы измените matches, вы будете менять перечисление WHILE, перечислив его. Конечно, это не работает, и вам нужна новая переменная для хранения измененного matches.

+1

, это не так. значение переменной совпадений было изменено, а не совпадало. код не генерирует исключений, он ведет себя иначе, чем ожидал автор. – lisp

+0

@lisp: Это просто не рекомендуется перечислить ту же переменную, которую вы пытаетесь изменить в цикле foreach. «Вел себя по-другому, чем ожидал автор», можно интерпретировать как «не работает», верно? ;) – waka

+0

это правда, что исходный код был «плохим», но проблема не в том, что вы описали. – lisp

0

Просто используйте две переменные для Matches. 1 для использования для каждого цикла. Другие модифицированы по вашему желанию. Или используйте базовую для цикла с счетчиком. Вы не можете изменять активно используемую коллекцию (цикл foreach).

0

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

void ForEach(Regex rx, string str) 
{ 
    foreach (Match match in rx.Matches(str)) 
    { 
     // code that might change str 

     // if(the str was changed) 
      ForEach(rx, str); 
    } 
} 
Смежные вопросы