0

下面的代码做了一个简单的事情。操作 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、如何解决?

4

2 回答 2

8

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

SinglePostViewModel tmpPost = new SinglePostViewModel();

进入循环。

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

我不想每次执行 foreach 循环时都新建一个对象,我认为这会花费很多,

如果您不创建那么多对象,您如何期望保持不同的值?您希望数据保存在哪里?你有什么证据证明你的绩效问题?

了解引用类型和值类型的工作原理非常重要。请阅读我关于此主题的文章,并思考如何将其应用于您的情况。

于 2013-05-17T08:30:50.417 回答
3

如果我们假设SinglePostViewModel,那么您将在列表中多次添加相同的引用。只有一个实例SinglePostViewModel- 您每次都只是简单地覆盖它,因此失败。

我不想每次执行 foreach 循环时都新建一个对象,我认为这会花费很多

除非您谈论的是数以百万计的记录,否则您的担忧不太可能是合理的。毕竟,数据需要去某个地方。

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

  1. 因为你只有一个对象可以一直覆盖
  2. 不要那样做
于 2013-05-17T08:33:04.423 回答