为什么Foreach不会影响?

Alb*_*Gao 0 c# foreach loops list observablecollection

下面的代码做了一件简单的事情.操纵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;
Run Code Online (Sandbox Code Playgroud)

但结果是tmpList充满了相同的数据,这是最后一次foreach操作的结果.但我认为我已经重新分配了tmpPost值,似乎每个Add方法都会发生在前一个.

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

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

Jon*_*eet 8

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

SinglePostViewModel tmpPost = new SinglePostViewModel();
Run Code Online (Sandbox Code Playgroud)

进入循环.

foreach (List<object> item in calljsonObject.data)
{
    SinglePostViewModel tmpPost = new SinglePostViewModel();
    tmpPost.doc_id = (long)item[0];
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

如果不创建那么多对象,您期望如何维护不同的值?您希望数据在哪里生存?您对性能问题有什么证据?

了解引用类型和值类型的工作方式非常重要.请阅读我关于此主题的文章,并考虑在您的情况下如何适用.

  • @AlbertGao你要写下10页的文字.你会使用多少张纸--1或10?你打算在同一张纸上逐页写所有文字,以便"拯救"其他九个吗? (4认同)