C#,同时循环覆盖每个迭代的作用域变量

本文关键字:迭代 作用域 变量 覆盖 循环 | 更新日期: 2023-09-27 18:26:43

我有两个列表,allChargesselectedCharges,其中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循环中的变量应该如何工作的错误理解吗?

如何使我的"费用"列表不会被每次迭代覆盖?

C#,同时循环覆盖每个迭代的作用域变量

问题是你没有"物化收费":这个

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);
    ...
}