2

私はリストを言っlistOriginalて、Viewstateに保存しています..

ViewState["Origion"] = listPatientEncounter;

ここで、リスト項目でいくつかの書式設定を行い、さらに使用するために別のビューステートに保存する必要があります..

 List<....> listCopy = new List<....>();
 listCopy= (from n in listOriginal select n).ToList();

 //This method formattes a few listCopy items
   ViewState["copylist"] = ConverttoUTCTime(listCopy);

ViewState["Origion"]しかし、問題は、2番目のリストで行われた変更が最初のリストにもopを表示することです。これにより、元の状態のアイテムを使用したい場所で問題が発生しています..

4

4 に答える 4

5

リストの項目がオブジェクトの場合、ソース オブジェクトのプロパティを変更しました。.ToList() は新しいリスト オブジェクトを作成しており、アイテムのクローンを作成していません。

つまり、同じ項目を持つ「別の」リストになります。

この問題を解決するには、リスト アイテムを複製する必要があります。

于 2012-12-10T14:05:51.203 に答える
3

オブジェクトは ref によって渡されます。リスト内のデータを 2 番目のリストにコピーする必要があります。.ToList() は使用できません。

元のリスト内の項目を複製し、それらを 2 番目のリストに追加する必要があります。値を手動でコピーするか、利用可能な場合は Clone() を使用できます。

于 2012-12-10T14:06:42.850 に答える
2

これは、(おそらく) 少なくとも取得した結果によると、リストの内容reference typeが.

リストの 1 つのインスタンス内で参照型が満たされ、別のインスタンスに移動されても、別のインスタンスにはなりません。(はい、別のポインターですが..)同じメモリ位置を指し続けます。したがって、異なるリスト要素が同じ場所を指しているため、ある要素によって行われた変更は別の要素からも見えます。

この問題を解決するために考えられる解決策の 1 つは、オブジェクトのクローンを作成することです。または、変更がソフトウェア アーキテクチャによって元のコレクションに影響を与えていない場合は、少なくとも変更する予定のオブジェクトのみを作成します。これは単なるアイデアです。ニーズに合ったソリューションを選択する必要があります。

于 2012-12-10T14:04:57.350 に答える
0

インプロセスセッション状態を使用しているため、2つのリストは実際にはリストの同じインスタンスを参照しています。真に2つの異なるリストを作成するには、リストのクローンを作成する必要があります。

これで、SQLセッション管理を使用している場合、これは基本的にクローン作成を実行することになり、オブジェクトをデータベースにシリアル化/逆シリアル化するため、それらは区別されます。

于 2012-12-10T14:09:01.740 に答える