微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# Foreach 在迭代 Db 表后返回相同的值

如何解决c# Foreach 在迭代 Db 表后返回相同的值

我有奇怪的问题。我试图用 5 行迭代 bd 表并返回此表值 + 图像作为字符串,当我检查 foreach 循环所有项目传递并添加到对象列表时,但是当返回所有值时,我发现列表中有 5 个相同的值物品 !!!都属于最后一行?

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; }
       
    }
 

var Transfer = new transferToFront();

                  var mylist = new List<object>();
                        foreach (var obj in Foodobjt)
                  {
                       String filePath = HostingEnvironment.MapPath(@"~/Images/");
                       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);

result of iteration

解决方法

Transfer 在循环的迭代中共享,因此每次您将相同的对象附加到列表中。内存映射看起来像:

+--------------------------+
|          Transfer        |
+--+----+----+----+---+----+
   |    |    |    |   |
+--+----+----+----+---+--+
|  0    1     2   3   4  |
|         myList         |
+------------------------+

因此,当您更改 Transfer 时,您会更改列表中的所有项目 - 因为它们是相同的

解决方案是为每次迭代创建一个全新的实例:

var mylist = new List<object>();
foreach (var obj in FoodObjt)
{
    var Transfer = new transferToFront();

    String filePath = HostingEnvironment.MapPath(@"~/Images/");
    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);

现在内存映射看起来像:

+----------+ +----------+ +----------+ +----------+ +----------+
|Transfer 1| |Transfer 2| |Transfer 3| |Transfer 4| |Transfer 5|
+--+-------+ +-----+----+ +---+------+ +----+-----+ +---+------+
   |               |          |             |           |
   |    +----------+          |             |           |
   |    |    +----------------+             |           |
   |    |    |    +-------------------------+           |
   |    |    |    |   +---------------------------------+
   |    |    |    |   |
+--+----+----+----+---+--+
|  0    1     2   3   4  |
|        myList          |
+------------------------+

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。