C#while循环覆盖每次迭代的范围变量

时间:2014-10-16 16:04:11

标签: c# list while-loop scope overwrite

我有2个列表,allChargesselectedChargesselectedCharges中的每个项目都包含在allCharges中。

我想创建第三个列表(称为charges),它是所有费用的副本,但如果费用在所选列表中,则每个项目的布尔属性为“已选择”设置为true费。

如果我只这样做一次,这很好;但是,我试图执行相同的操作五次,每次重写“费用”,同时将“费用”保存到我的“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”对象最终都会被上一次迭代中创建的charge对象覆盖,即使该变量是在while循环内声明的(因此应该是一个新的对象引用)每次迭代)。

这只是对while循环中的变量应如何工作的错误理解吗?

我怎样才能使每次迭代都不会覆盖我的“费用”列表?

1 个答案:

答案 0 :(得分:4)

问题是你没有“实现收费”:这个

var charges = nonSelectedCharges.Concat(selectedCharges);

是具有延迟评估的IEnumerable<Charge>。当您从Charges评估typeSettingsList时,循环结束,因此枚举IEnumerable<Charge>会返回typeId的最后一个值的结果(即{{ 1}})。

添加typeId = 5以解决此问题:

ToList()

修改:另一个问题是var charges = nonSelectedCharges.Concat(selectedCharges).ToList(); 正在使用links,它在循环中被修改。您应该在循环内定义一个新变量,以在特定迭代期间捕获typeId的状态,如下所示:

typeId