更新IEnumerable中的项目

问题描述 投票:0回答:2

我有此代码:

   class Foo
    {
        public string A { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var strings = new List<string> { "foo", "foo" };

            var list = strings.Select(x => new Foo { A = x });

            foreach (var item in list)
            {
                item.A = "bar";
            }

            foreach (var item in list)
            {
                Console.WriteLine(item.A);
            }
        }
    }

哪些印刷品:

foo
foo

设置item.A = "bar"时会发生什么?

在第一个foreach循环完成后,list var是否真的包含相同的两个Foo对象,且"bar"作为新字符串?

如果是这样,您如何访问这些新值?

我知道当第二个foreach循环运行时,它枚举了字符串的集合,这就是为什么要获得"foo"的两个打印输出的原因,但是我对运行item.A = "bar"时会发生什么感到困惑,并且如果您永远无法访问该新值,为什么编译器允许您修改它?

c# foreach iterator ienumerable
2个回答
0
投票

问题是您尚未调用ToList方法来实现LINQ查询。当您按以下方式呼叫ToList时:

var list = strings.Select(x => new Foo { A = x })
                  .ToList();

0
投票

由于Foo是类,所以item只是对象的引用


0
投票
您应该知道的一件事,您不能修改IEnumerable对象的项目。您必须使用List();
© www.soinside.com 2019 - 2024. All rights reserved.