241 字
1 分钟
[C#] 关于 Linq 拓展函数对迭代对象进行更改不生效的问题
偶然发现, 在使用 Linq 的 Select 方法时, 如果对被迭代对象进行更改, 那么这个更改是不会生效的
// 定义我们自己要用的类型class QWQ{ public int qwq; public string awa; public QWQ(){} public QWQ(int qwq){this.qwq=qwq;}}// 用来执行的方法static void LinqExTest(){ List<QWQ> qwqs = Enumerable.Range(0, 10).Select(v => new QWQ(v)).ToList(); // 在迭代的同时, 对原对象进行更改: qwqs.Select(v => v.awa = v.qwq.ToString()); // 打印对象 Console.WriteLine(string.Join("\n", qwqs.Select(v => $"qwq:{v.qwq}, awa:{v.awa}")));}最终执行效果是:
qwq:0, awa:qwq:1, awa:qwq:2, awa:qwq:3, awa:qwq:4, awa:qwq:5, awa:qwq:6, awa:qwq:7, awa:qwq:8, awa:qwq:9, awa:显然, 对原对象的更改没有生效! 即便是改为通过索引来访问, 也是不彳亍:
qwqs.Select((v, i) => qwqs[i].awa = v.qwq.ToString());qwq:0, awa:qwq:1, awa:qwq:2, awa:qwq:3, awa:qwq:4, awa:qwq:5, awa:qwq:6, awa:qwq:7, awa:qwq:8, awa:qwq:9, awa:但是如果将 Select 语句改为 foreach 语句, 则会成功运行:
foreach(var v in qwqs) v.awa = v.qwq.ToString();qwq:0, awa:0qwq:1, awa:1qwq:2, awa:2qwq:3, awa:3qwq:4, awa:4qwq:5, awa:5qwq:6, awa:6qwq:7, awa:7qwq:8, awa:8qwq:9, awa:9 [C#] 关于 Linq 拓展函数对迭代对象进行更改不生效的问题
https://slimenull.com/posts/20210409100935/