C#,同时循环覆盖每个迭代的作用域变量
本文关键字:迭代 作用域 变量 覆盖 循环 | 更新日期: 2023-09-27 18:26:43
我有两个列表,allCharges
和selectedCharges
,其中selectedCharges
中的每个项都包含在allCharges
中。
我想创建第三个列表(称为charges
),它是所有费用的副本,但如果费用在选定费用的列表中,则每个项目的布尔属性"Selected"设置为true。
如果我只做过一次,那也没关系;然而,我尝试执行相同的操作五次,每次都重写"charges",同时将"chargess"保存到我的"typeSettingsList"中。
IList<TypeSettings> typeSettingsList = new List<TypeSettings>();
var typeId = 1;
while (typeId < 6)
{
var links = _linkChargeTypeRepo.Query().Where(l => l.TypeId == typeId);
var allCharges = _chargeRepo.GetAll().ToList();
var selectedCharges = links.Select(l => l.ChargeType).ToList();
selectedCharges.ForEach(c => c.Selected = true);
var nonSelectedCharges = allCharges.Except(selectedCharges).ToList();
nonSelectedCharges.ForEach(c => c.Selected = false);
var charges = nonSelectedCharges.Concat(selectedCharges).ToList();
var settingsWithType = new TypeSettings
{
Type = _typeRepo.Get(typeId),
Charges = charges
};
typeSettingsList.Add(settingsWithType);
typeId++;
}
return settingsWithType;
我的问题是,我的typeSettingsList中的每个"Charges"对象最终都会被上次迭代时创建的Charges对象覆盖,即使变量是在while循环中声明的(因此每次迭代都应该是新的对象引用)。
这只是对while循环中的变量应该如何工作的错误理解吗?
如何使我的"费用"列表不会被每次迭代覆盖?
问题是你没有"物化收费":这个
var charges = nonSelectedCharges.Concat(selectedCharges);
是具有延迟评估的CCD_ 7。当您从IEnumerable<Charge>
中计算typeSettingsList
时,循环已经结束,因此枚举typeId
将返回typeId = 5
(即ToList()
)的最后一个值的结果。
添加links
以修复此问题:
var charges = nonSelectedCharges.Concat(selectedCharges).ToList();
编辑:另一个问题是typeId
正在使用循环中修改的typeId
。您应该在循环中定义一个新变量,以在特定迭代期间捕获CCD_16的状态,如下所示:
var typeId = 1;
while (typeId < 6)
{
var tmpTypeId = typeId;
var links = _linkChargeTypeRepo.Query().Where(l => l.TypeId == tmpTypeId);
...
}