[C#] 关于 Linq 拓展函数对迭代对象进行更改不生效的问题

62 篇文章 6 订阅
23 篇文章 0 订阅

偶然发现, 在使用 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:0
qwq:1, awa:1
qwq:2, awa:2
qwq:3, awa:3
qwq:4, awa:4
qwq:5, awa:5
qwq:6, awa:6
qwq:7, awa:7
qwq:8, awa:8
qwq:9, awa:9
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值