如何修复List <list <string>&gt; </list <string>中的数据

时间:2012-08-22 19:38:33

标签: c# list

我有一个名为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 个答案:

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

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

答案 1 :(得分:0)

你不能使用foreach修改你枚举的Collection,所以只需使用regular 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();
}

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

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