2

我有一个名为 result 的变量,它是

List<List<string>>

我想解析每个元素并修复它(删除空格等)

            i = 0;
            foreach (List<string> tr in res)
            {
                foreach (string td in tr)
                {
                    Console.Write("[{0}] ", td);
                    td = cleanStrings(td); // line with error
                    i++;
                }
                Console.WriteLine();
            }

    public string cleanStrings(string clean)
    {
        int j = 0;                
        string temp = System.Text.RegularExpressions.Regex.Replace(clean, @"[\r\n]", "");
        if (temp.Equals("&nbsp;"))
        {
            temp = " ";
            temp = temp.Trim();
        }
        clean = temp;                        
        return clean;
    }

错误 1 ​​无法分配给“td”,因为它是“foreach 迭代变量”

我将如何解决这个问题?

4

4 回答 4

12

基本上你不必使用foreach. .NET 中的迭代器基本上是只读的。例如:

for (int i = 0; i < tr.Count; i++)
{
    string td = tr[i];
    Console.Write("[{0}] ", td);
    tr[i] = CleanStrings(td);
}

(请注意,我使用了i您正在递增但未使用的变量。)

或者,考虑使用 LINQ:

res = res.Select(list => list.Select(x => CleanStrings(x)).ToList())
         .ToList();

请注意,这会创建一个列表的列表,而不是改变任何现有列表。

于 2012-08-22T19:40:58.680 回答
0

您无法使用 foreach 修改您正在枚举的集合,因此只需使用常规 for 循环:

for (int m = 0; m < res.Count; m++)
{
    for (int j = 0; j < res[m].Count; j++)
    {
        Console.Write("[{0}] ", td);
        res[m][j] = cleanStrings(res[m][j]);
        i++;
    }
    Console.WriteLine();
}
于 2012-08-22T19:42:25.480 回答
0

您必须使内部循环成为for循环才能获取列表中的索引tr。这使您能够替换列表中此索引处的条目。但是,您可以保留外部foreach循环。

i = 0;
foreach (List<string> tr in res) {
    for (int k = 0; k < tr.Count; k++) {
        string td = tr.[k];
        Console.Write("[{0}] ", td);
        tr[k] = cleanStrings(td); // line with no error anymore
    }
    i += tr.Count;
    Console.WriteLine();
}
Console.WriteLine("Total number of items: {0}", i);
于 2012-08-22T19:43:22.710 回答
0

正如错误所暗示的那样,您将无法通过更改迭代器变量来修复 List 的内容,并且您在外部 foreach 中具有相同的约束。有几种方法,但您可以尝试的一种方法如下:

        i = 0;
        foreach (List<string> tr in res)
        {
            for (int currentItem; currentItem<=tr.Count; currentItem++)
            {
                Console.Write("[{0}] ", tr[currentItem]);
                res[i][currentItem] = cleanStrings(tr[currentItem]); // line with error
            }
            i++;
            Console.WriteLine();
        }
于 2012-08-22T19:45:16.233 回答