2014-10-16 116 views
0

我有2所列出,allChargesselectedCharges,其中在每个selectedCharges项包含在allChargesC#while循环重写范围的变量随每次迭代

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

这很好,如果我只做一次;但是,我试图执行相同的操作五次,每次将“费用”保存到我的“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每个“收费”对象结束了对象,它是在最后一次迭代产生的费用覆盖掉了,即使变量在while循环内声明的(因此应每次迭代都有一个新的对象引用)。

这只是一个错误的理解,如何在while循环内的变量应该工作?

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

+0

selectedCharges是一个列表变量,TypeSettings(我猜)是不是值类型。每个列表都是新的,但它包含的对象是_reused_ – 2014-10-16 16:08:02

+0

@AdrianoRepetti我不知道我明白你在说什么。我的类型设置对象是包含类型和列表的对象。有没有理由不这样做? – MitchVz 2014-10-16 16:26:04

回答

4

的问题是,你没有“兑现 charges`:此

var charges = nonSelectedCharges.Concat(selectedCharges); 

IEnumerable<Charge>递延评估通过你从typeSettingsList评估Charges时,循环结束,所以。枚举IEnumerable<Charge>返回结果为typeId(即typeId = 5)的最后一个值

添加ToList()来解决这个问题:

var charges = nonSelectedCharges.Concat(selectedCharges).ToList(); 

编辑:的另一个问题是links使用typeId,其在环路修改。您应该定义一个新的变量循环内的特定迭代过程中捕获的typeId状态,就像这样:

var typeId = 1; 
while (typeId < 6) 
{ 
    var tmpTypeId = typeId; 
    var links = _linkChargeTypeRepo.Query().Where(l => l.TypeId == tmpTypeId); 
    ... 
} 
+0

糟糕,我复制并粘贴了一些不正确的代码。我有ToList()在那里开始。我现在加了它,并得到相同的结果。 – MitchVz 2014-10-16 16:18:00

+0

@MitchVz这很奇怪。我期望'Type'关闭,因为'typeId'在循环中被修改(假设有一些延迟执行,可能会或可能不会)。但其他地方使用'ToList()',所以它应该简单的工作。如果您确定您正在运行最新的代码,请尝试在循环中添加一些调试输出以记录您获得的费用的关键统计信息,甚至可能是列表本身,并查看问题是否出现在收集阶段循环中的费用。 – dasblinkenlight 2014-10-16 16:29:17

+0

是的,'Type'只是工作中唯一的东西:) 返回的对象有五种不同的类型,但每种类型都有相同的“Charges”列表 – MitchVz 2014-10-16 16:35:15