C#中IEnumerable<>和List<>对循环结果的影响

                var altColorList = itemimagelist.Select(z => z.Alt).Distinct();
                foreach (var color in altColorList)
                {
                    var colorImageNum = 0;
                    foreach (var productImage in itemimagelist.Where(z => z.Alt.Trim().Contains(color.Trim())))
                    {
                        colorImageNum++;
                        var newAlt = $"{altName}-{Regex.Replace(color.Trim(), pattern, replacement)}-{colorImageNum:D3}";
                        productImage.Alt = newAlt.Trim();
                    }
                } 
                List<string> altColorList = itemimagelist.Select(z => z.Alt).Distinct().ToList();
                foreach (var color in altColorList)
                {
                    var colorImageNum = 0;
                    foreach (var productImage in itemimagelist.Where(z => z.Alt.Trim().Contains(color.Trim())))
                    {
                        colorImageNum++;
                        var newAlt = $"{altName}-{Regex.Replace(color.Trim(), pattern, replacement)}-{colorImageNum:D3}";
                        productImage.Alt = newAlt.Trim();
                    }
                }

第一段代码:查询出来的是IEnumerable直接参与循环
第一段代码:查询出来后通过ToList()转为List后参与循环

问题:
两段代码处理后的结果不一致

原因:
第二个foreach循环的代码中有修改itemimagelist的Alt操作,影响了第一个foreach循环
第一段代码:IEnumerable会延迟执行,所以在第一个foreach循环的表达式每次都会重新执行一次.由于第二个foreach循环会修改itemimagelist的Alt,导致了第一个foreach循环的表达式存在不相同的情况.
第二段代码:List存储在内存中,不会重复执行.所以保存了第一个foreach循环的表达式不会变化.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值