为了账号安全,请及时绑定邮箱和手机立即绑定

MVC 列表错误列表<型号>

MVC 列表错误列表<型号>

C#
小怪兽爱吃肉 2021-11-14 14:53:57
我正在使用 foreach 将数据从列表传输到另一个列表,但是当添加自动更新到最后添加的值时。例如:list1 = [1,2,3]list2 = new List<Model>()foreach(var item in list1) {   list2.Add(item)}the result in list2 is [ 3, 3, 3]实际上的例子如下:var _sizes = new List<ProductsSize>();var _size = new ProductsSize();if (model.Dynamic_ProductsSize.Count > 0){    foreach (var item in model.Dynamic_ProductsSize)    {        _size.SizeId = item;        _sizes.Add(_size);    }}model.ProductsSize = _sizes.ToList();我需要知道为什么它只需要最后一项以及这种情况的解决方案是什么
查看完整描述

2 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

你只有一个 ProductsSize对象:


var _size = new ProductsSize();

你不断修改同一个对象。该对象的所有引用,包括当你修改它被添加到,获取更新的任何列表元素一个对象。


相反,在循环中创建新对象:


foreach (var item in model.Dynamic_ProductsSize)

{

    var _size = new ProductsSize();

    _size.SizeId = item;

    _sizes.Add(_size);

}

这样列表中的每个元素都是一个新对象,而不是多次添加的同一个对象。


旁注,您在代码中有一些不必要的东西。例如,在循环之前检查长度,以及在末尾将列表转换为列表。


事实上,我想所有显示的代码都可以简化为:


model.ProductsSize = model.Dynamic_ProductsSize.Select(p => new ProductsSize { SizeId = p }).ToList();

在这种情况下,您也只是将一个模型属性转换为另一个模型属性。为什么不把这个逻辑放在模型本身并跳过整个事情?


public IEnumerable<ProductsSize> ProductsSize

{

    get { return this.Dynamic_ProductsSize.Select(p => new ProductsSize { SizeId = p });

}

除非有一个特殊的原因,你想要在两个不同的属性中两次使用相同的数据,这在这段代码中并不清楚,有一组数据和不同的视图/计算/等。的数据通常是首选。


查看完整回答
反对 回复 2021-11-14
?
慕后森

TA贡献1802条经验 获得超5个赞

在将其添加到列表之前创建一个新对象。您可以使用对象初始值设定项语法来保持简洁:


 if (model.Dynamic_ProductsSize.Count > 0)

{

    foreach (var item in model.Dynamic_ProductsSize)

    {

        _sizes.Add(new ProductsSize(){SizeId = item});

    }

}


查看完整回答
反对 回复 2021-11-14
  • 2 回答
  • 0 关注
  • 145 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信