我有一个名为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(" "))
{
temp = " ";
temp = temp.Trim();
}
clean = temp;
return clean;
}
错误1无法分配给'td',因为它是'foreach迭代变量'
我该如何解决这个问题?
答案 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();
}