C#“无法分配字段,因为它是foreach迭代变量”

3
我想要修剪CSV文件的列标题,下面的字段是包含标题名称的数组,在哪里应该放置trim()?我已经在foreach循环中放置了它,但VS告诉我“无法分配字段,因为它是一个foreach迭代变量”。我做错了什么?
while ((fields = csv.GetCSVLine()) != null) 
{
    if (header)
    {
        foreach (string field in fields) 
        {
              //field = field.trim(); //VS: "cannot assign field because it is a foreach iteration variable"
          headers.Add(field);
        }
}
5个回答

10

Add()调用的同一行上执行此操作即可。如果直接将Trim()的结果传递给Add(),则无需覆盖变量field

foreach (string field in fields) 
{
    headers.Add(field.Trim());
}

8

您正在尝试更改您正在处理的项目的值。

只需执行以下操作:

var trimmedField=field.Trim();
headers.Add(trimmedField);

6
您可以使用headers.Add(field.Trim());更加简洁地表达。 - Doctor Jones
如果你只使用修剪过的版本一次,同样是明智的选择。 - JasonTrue

3
    foreach (string field in fields) 
    {
      headers.Add(field.Trim());
    }

3

在我看来,编译器已经明确告诉你你正在做错误的事情:你试图分配一个迭代变量,显然你不允许这样做。

其他答案已经告诉你可以做什么:要么将迭代变量复制到另一个变量中并修剪它,要么完全跳过赋值并直接添加修剪后的值。


3
公正地说,编译器的警告并不明确指出应该做什么,MSDN文档也不是特别好。但是,一旦您开始了解C#如何处理值类型和引用类型,一切都变得有一定的道理。 - andersop

1

尽管外观可能不太“现代化”,但在所描述的情况下,使用For循环执行速度和资源友好性可能是相当快的:

while ((fields = csv.GetCSVLine()) != null) {
    if (header) {
        for(int ii = 0; ii < fields.Count; ii++) {
            headers.Add(field);
}   }   }

当然,我相信这个问题在几年前就已经解决了,但我只是想把这个问题放出来,以帮助其他人浏览。我个人认为,我们不允许给foreach迭代器分配值有点儿愚蠢(我怀疑他们可以很容易地在编译和/或运行时解决这个障碍)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接