foreach循环:赋值后不能修改循环变量(?)

时间:2014-02-21 08:44:05

标签: c# regex

我有以下代码:

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 ?       
}

有人可以帮我解决上述问题吗?

编辑:

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循环中。这就是问题。怎么解决?

4 个答案:

答案 0 :(得分:1)

您正在枚举matches,因此如果您更改matches,则您正在更改枚举,而您正在枚举它。当然这不起作用,您需要一个新变量来保存更改后的matches

答案 1 :(得分:0)

您不应修改当前正在迭代的对象:首先创建原始对象的副本,然后将更改应用于副本。

答案 2 :(得分:0)

只需为Matches使用两个变量即可。 1用于每个循环..另一个根据您的意愿修改。或者使用带有计数器的基本循环。您无法修改主动使用的集合(foreach循环)。

答案 3 :(得分: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);
    }
}