C# 为什么Foreach没有影响?

C# 为什么Foreach没有影响?,c#,list,loops,foreach,observablecollection,C#,List,Loops,Foreach,Observablecollection,下面的代码做了一件简单的事情。操纵API的原始数据并将其绑定到视图模型的属性 我从web服务获取数据并将其保存到名为calljsonObject的对象中。这是原始数据。然后,我执行foreach循环,从原始数据中选择所选数据,并将其保存到名为tmpList的对象,最后一行,将tmpList绑定到名为docList的视图模型属性 SingleBoardListRawData calljsonObject = JsonConvert.DeserializeObject<S

下面的代码做了一件简单的事情。操纵API的原始数据并将其绑定到视图模型的属性

我从web服务获取数据并将其保存到名为calljsonObject的对象中。这是原始数据。然后,我执行foreach循环,从原始数据中选择所选数据,并将其保存到名为tmpList的对象,最后一行,将tmpList绑定到名为docList的视图模型属性

           SingleBoardListRawData calljsonObject = JsonConvert.DeserializeObject<SingleBoardListRawData>(callbackjsonstring);

           ObservableCollection<SinglePostViewModel> tmpList = new ObservableCollection<SinglePostViewModel>();
           SinglePostViewModel tmpPost = new SinglePostViewModel();
           foreach (List<object> item in calljsonObject.data)
           {
               tmpPost.doc_id = (long)item[0];
               tmpPost.doc_title = (string)item[1];
               tmpPost.doc_author = (string)item[2];
               tmpPost.repliesCount = (long)item[4];
               tmpPost.doc_post_date = DateTime.Parse((string)item[5]);
               tmpPost.OnTop = (long)item[6];
               tmpPost.CoolPost = (long)item[7];
               tmpPost.doc_update_date = DateTime.Parse((string)item[9]);
               tmpPost.PicInDoc = (long)item[10];
               tmpPost.reply_user_name = (string)item[11];
               tmpPost.doc_brief = (string)item[13];
               tmpList.Add(tmpPost);
           }
           this.docList = tmpList;
但是结果是tmpList充满了相同的数据,这是最后一次foreach操作的结果。但是我认为我已经重新分配了tmpPost值,似乎每个Add方法都会发生在前一个方法中

我不想每次我做foreach循环时都要新建一个对象,我认为这要花很多钱

我的问题是: 1.为什么?
2.如何解决这个问题?

您在每次迭代中都添加对同一对象的引用,并在每次迭代中覆盖该对象中的数据。您需要在每次迭代中创建一个新对象。移动此行:

SinglePostViewModel tmpPost = new SinglePostViewModel();
进入循环

foreach (List<object> item in calljsonObject.data)
{
    SinglePostViewModel tmpPost = new SinglePostViewModel();
    tmpPost.doc_id = (long)item[0];
    ...
}
我不想每次我做foreach循环时都要新建一个对象,我认为这要花很多钱

如果不创建那么多对象,您希望如何维护不同的值?您希望数据在哪里?你有什么证据可以证明你对绩效的担忧

了解引用类型和值类型的工作方式非常重要。请阅读并思考这在您的情况下是如何应用的。

如果我们假设SinglePostViewModel,那么您将在列表中多次添加相同的引用。SinglePostViewModel只有一个实例——每次都写得太多,因此失败

我不想每次我做foreach循环时都新建一个对象,我认为这要花很多钱

除非你谈论的是上千万张唱片,否则你的担心很可能是没有道理的。毕竟,数据需要去某个地方

我的问题是:1。为什么?2.如何解决

因为你只有一件东西你一直在写 不要那样做
@阿尔伯特:不,真的没有;分配很便宜;收集短命的对象是非常困难的cheap@AlbertGao:不,它不需要很多钱,与调用web服务相比,它实际上是免费的!不,没有更好的办法了。您应该认真思考为什么希望能够存储大量不同的值,而不创建大量不同的对象。您希望数据存储在哪里?这里有一个非常重要的基本点需要思考,你要写下10页的文字。你要用多少张纸?1张还是10张?为了“保存”其他九篇文章,你是否打算一页一页地把所有文章写在同一张纸上?@AlbertGao:性能很重要,但正确性更重要。。。在开始进行任何类型的优化之前,您确实需要很好地理解您的代码。当你理解了你的代码的功能后,你就可以开始了解什么是昂贵的,在什么环境下。@OndrejTucny你在过去的某个时候也是个新手,当然你可以问问你过去的自己;