相关疑难解决方法(0)

为什么C#foreach语句中的迭代变量是只读的?

据我了解,C#的foreach迭代变量是不可变的.

这意味着我不能像这样修改迭代器:

foreach (Position Location in Map)
{
     //We want to fudge the position to hide the exact coordinates
     Location = Location + Random();     //Compiler Error

     Plot(Location);
}
Run Code Online (Sandbox Code Playgroud)

我无法直接修改迭代器变量,而是必须使用for循环

for (int i = 0; i < Map.Count; i++)
{
     Position Location = Map[i];
     Location = Location + Random();

     Plot(Location);        
     i = Location;
}
Run Code Online (Sandbox Code Playgroud)

来自C++背景,我认为foreach是for循环的替代品.但是由于上述限制,我通常会回退使用for循环.

我很好奇,使迭代器不可变的原理是什么?


编辑:

这个问题更多的是一个好奇的问题,而不是一个编码问题.我很欣赏编码答案,但我不能将它们标记为答案.

此外,上面的例子过于简化了.这是我想要做的C++示例:

// The game's rules: 
//   - The "Laser Of Death (tm)" moves around the game board from the
//     start area (index …
Run Code Online (Sandbox Code Playgroud)

c# language-design

35
推荐指数
3
解决办法
2万
查看次数

在C#中的foreach循环中更新结构

我有这个代码(C#):

using System.Collections.Generic;

namespace ConsoleApplication1
{
    public struct Thing
    {
        public string Name;
    }

    class Program
    {
        static void Main(string[] args)
        {
            List<Thing> things = new List<Thing>();
            foreach (Thing t in things) //  for each file
            {
                t.Name = "xxx";
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它不会编译.
错误是:

Cannot modify members of 't' because it is a 'foreach iteration variable'
Run Code Online (Sandbox Code Playgroud)

但是,如果我Thing改为a class而不是a struct,它会编译.

请有人解释一下发生了什么?

.net c# foreach

7
推荐指数
3
解决办法
2万
查看次数

关于IEnumerable与List的C#foreach - 仅针对数组的元素修改 - 为什么?

在C#中,我注意到如果我在LINQ生成的IEnumerable<T>集合上运行foreach循环并尝试修改每个T元素的内容,我的修改就不会持久.

另一方面,如果我在创建集合时应用ToArray()or ToList()方法,则对foreach循环各个元素的修改持久的.

我怀疑这在某种程度上与延迟执行有关,但究竟对我来说并不完全是显而易见的.我真的很感激这种行为差异的解释.

这是一些示例代码 - 我有一个MyClass带有构造函数和自动实现属性的类:

public class MyClass
{
    public MyClass(int val) { Str = val.ToString(); }
    public string Str { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在我的示例应用程序中,我使用LINQ 基于一个整数Select()集合创建两个MyClass对象集合,一个IEnumerable<MyClass>和一个最后IList<MyClass>应用该ToList()方法.

var ints = Enumerable.Range(1, 10);
var myClassEnumerable = ints.Select(i => new MyClass(i));
var myClassArray = ints.Select(i => new MyClass(i)).ToList();
Run Code Online (Sandbox Code Playgroud)

接下来,我在每个集合上运行一个foreach循环,并修改循环MyClass对象的内容:

foreach (var obj in myClassEnumerable) obj.Str …
Run Code Online (Sandbox Code Playgroud)

c# ienumerable foreach reference

3
推荐指数
1
解决办法
3510
查看次数

标签 统计

c# ×3

foreach ×2

.net ×1

ienumerable ×1

language-design ×1

reference ×1