2014-10-16 128 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