C# 每当一个新项目被添加到列表中,它都会用刚刚添加的项目替换旧项目#

C# 每当一个新项目被添加到列表中,它都会用刚刚添加的项目替换旧项目#,c#,list,C#,List,我试图构建一个函数,将一类项添加到另一个类中。每当我添加一个新项目时,它都会复制该项目,无论我以前尝试添加了多少次新项目 myfunction() { AmazonEnvelopeMessage message = new AmazonEnvelopeMessage(); List<AmazonEnvelopeMessage> list = new List<AmazonEnvelopeMessage>(); AmazonE

我试图构建一个函数,将一类项添加到另一个类中。每当我添加一个新项目时,它都会复制该项目,无论我以前尝试添加了多少次新项目

  myfunction()
   {
   AmazonEnvelopeMessage message = new AmazonEnvelopeMessage();
        List<AmazonEnvelopeMessage> list = new List<AmazonEnvelopeMessage>();
        AmazonEnvelopeLibrary.Models.Product product = new Product() 
   foreach (var s in skus)
        { 
   product.DescriptionData.Title = s.Title;
                product.StandardProductID.Value = s.ASIN;
                product.StandardProductID.Type = StandardProductIDType.ASIN;
                product.ProductData.Item = maincat;
                product.DescriptionData.MSRP.Value = s.MSRP;
                product.DescriptionData.Description = s.description;
           message.Item = product;
            list.Add(message);
      }
      amazon.Envelope.message.AddRange(list);
    }
myfunction()
{
AmazoneDevelopeMessage message=新AmazoneDevelopeMessage();
列表=新列表();
AmazonDevelopelibrary.Models.Product=新产品()
foreach(SKU中的var s)
{ 
product.DescriptionData.Title=s.Title;
product.StandardProductID.Value=s.ASIN;
product.StandardProductID.Type=StandardProductIDType.ASIN;
product.ProductData.Item=maincat;
product.DescriptionData.MSRP.Value=s.MSRP;
product.DescriptionData.Description=s.Description;
message.Item=产品;
列表。添加(消息);
}
amazon.Envelope.message.AddRange(列表);
}

您的代码有一些问题,但通常这是您的问题

AmazonEnvelopeMessage message = new AmazonEnvelopeMessage();

foreach (...)
{
    list.Add(message); // you keep passing reference to the same object.
}
您正在将引用传递给相同的对象

为了修复它,您需要这样做

foreach (...)
{
    AmazonEnvelopeMessage message = new AmazonEnvelopeMessage();
    list.Add(message); // now you're passing a new one each time
}

如果“amazoneveloplemessage”和“amazoneveloplelibrary.Models.Product”是类,那么您正在处理一个引用类型问题。在这种情况下,在foreach循环中移动“message”和“product”可以解决问题。但这并不能解决实际问题。有两种方法可以将信息保存在C#的内存中;堆积如山。我建议你看看其他用户问的问题。这会让你明白为什么会这样

myfunction()
   {
       List<AmazonEnvelopeMessage> list = new List<AmazonEnvelopeMessage>();
       foreach (var s in skus)
       { 
           AmazonEnvelopeMessage message = new AmazonEnvelopeMessage();
           AmazonEnvelopeLibrary.Models.Product product = new Product();
           ...
           message.Item = product;
           list.Add(message);
      }
      amazon.Envelope.message.AddRange(list);
    }
myfunction()
{
列表=新列表();
foreach(SKU中的var s)
{ 
AmazoneDevelopeMessage message=新AmazoneDevelopeMessage();
AmazonDevelopelibrary.Models.Product=新产品();
...
message.Item=产品;
列表。添加(消息);
}
amazon.Envelope.message.AddRange(列表);
}

您不需要指定消息或项目的键或id吗?您的代码未编译且存在错误。您在循环中多次添加相同的产品对象。您正在修改单个对象的字段,但只有最后一轮循环中的更改才有效。另外,当AddRange中使用了所有指向同一对象的条目列表时,以后会发生什么?我取出了一些与问题无关的代码部分,部分原因是这是我为公司工作的一个项目,我想对它保密,但让人们大致了解正在发生的事情。基本上所有的信息都会被序列化。我试过了,但列表中的消息仍然是重复的。不仅是消息变量,还有产品变量problem@liz这只是一个类,(如史提夫所指出的)你还有其他人要考虑。确保每个迭代中都有新的内容。