我有2个列表,allCharges
和selectedCharges
,selectedCharges
中的每个项目都包含在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循环中的变量应如何工作的错误理解吗?
我怎样才能使每次迭代都不会覆盖我的“费用”列表?
答案 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