Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “C”;无法分配字段,因为它是foreach迭代变量";_C#_Foreach - Fatal编程技术网

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

C# “C”;无法分配字段,因为它是foreach迭代变量";,c#,foreach,C#,Foreach,我想修剪CSV文件的列标题,下面的字段是一个包含标题名称的数组,我将在哪里放置trim()?我把它和foreach循环放在一起,但是VS告诉我“不能分配字段,因为它是foreach迭代变量”。我做错了什么 while ((fields = csv.GetCSVLine()) != null) { if (header) { foreach (string field in fields) { //field = fi

我想修剪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);
        }
}

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

照办

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

您可以在与
Add()
调用相同的行上执行此操作。如果将
Trim()
的结果直接传递给
Add()
,则无需覆盖变量
字段


在我看来,编译器已经确切地告诉了你做错了什么:你试图分配一个迭代变量,这显然是不允许的


这里的其他答案告诉了您可以做什么:要么将迭代变量复制到另一个变量中并对其进行修剪,要么完全跳过赋值,直接添加修剪后的值。

尽管外观不太“现代”,在所描述的情况下,简单地使用For循环执行速度和资源友好性差不多,即:

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

当然,我相信这个问题在几年前就解决了,但我只是把它放在那里,以帮助其他人浏览。我个人认为,不允许我们为foreach迭代器赋值有点愚蠢(我怀疑它们可以在编译和/或运行时轻松地克服这个障碍(比如它)。

或者更简洁地说,可以使用headers.Add(field.Trim());同样合理,尤其是当你只使用一次修剪过的版本时。公平地说,编译器警告对你应该做的事情毫无帮助,而且MSDN文档也不太引人注目。但是,一旦你开始理解C#如何处理值和引用类型,这一切都有一定的意义。
    foreach (string field in fields) 
    {
      headers.Add(field.Trim());
    }
while ((fields = csv.GetCSVLine()) != null) {
    if (header) {
        for(int ii = 0; ii < fields.Count; ii++) {
            headers.Add(field);
}   }   }