C#遍历数据库表后返回列表元素全部为最后一行数据的异常问题
哥们,你这遇到的是C#里引用类型的经典坑啊!
问题根源
你在foreach循环外面只创建了一个transferToFront对象,每次循环只是修改这个对象的属性值,然后把同一个对象的引用塞进列表里。列表里存的全是指向同一个对象的指针,等循环结束,这个对象的属性已经被最后一行数据覆盖了,所以返回的列表自然全是最后一行的内容。
修复代码
把transferToFront的实例化移到循环内部就行,每次循环都创建一个新对象,每个对象对应数据库的一行数据:
public class TransferItem { public string foodType { set; get; } public string foodName { set; get; } public int foodPrice { set; get; } public string foodDescription { set; get; } public byte[] foodImage { set; get; } } // 建议用强类型列表,别用object,类型更安全 var mylist = new List<transferToFront>(); // 路径计算移到外面,避免重复执行 String filePath = HostingEnvironment.MapPath(@"~/Images/"); foreach (var obj in FoodObjt) { // 每次循环新建一个对象! var Transfer = new transferToFront(); Transfer.Id = obj.Id; Transfer.foodName = obj.foodName; Transfer.foodImage = obj.foodImage; Transfer.foodPrice = obj.foodPrice; Transfer.foodType = obj.foodType; Transfer.foodDescription = obj.foodDescription; var imageString = System.IO.File.ReadAllBytes(filePath + obj.foodImage); Transfer.Image = imageString; mylist.Add(Transfer); } return Ok(mylist);
额外小提示
- 把
List<object>换成List<transferToFront>,编译时就能检查类型错误,后续使用也不用强制转换,代码更靠谱。 - 把
filePath的计算放到循环外面,不然每次循环都要跑一遍路径映射,有点浪费性能。
内容的提问来源于stack exchange,提问作者Amir A
相关产品推荐
相关产品推荐

