0

問題が発生しましたが、何が起こっているのかよくわかりません。誰かが助けてくれることを願っています!

データベースからエントリを収集し、それらをリスト コレクションに配置しています。このリスト コレクションを使用して、「アクティブな」ものの辞書を作成しています。リストをテンプレートとして使用しており、「アクティブな」エントリ アイテムがすべてです。 「アクティブな」モノが削除され、「アクティブな」モノの新しいインスタンスがリスト コレクションからディクショナリに挿入されるまで操作できません。私が見ている問題は、リスト コレクション内の項目と辞書項目が更新されていることです。

これは少なくとも私にとっては問題です。誰かがより良い解決策を提供できることを願って、私はおそらくひどく間違ったことをしています。

例えば:

  public class DataEntry
    {
        public string DataOne { get; set; }
        public int DataTwo { get; set; }

    }

public static List<DataEntry> dataCollection = new List<DataEntry>();
public static Dictionary<int, DataEntry> ActiveList = new Dictionary<int, DataEntry>();
private static int activeIndex = 0;

public static void LoadListFromDB()
{

    dataCollection.Add(new DataEntry() { DataOne = "Lakedoo", DataTwo = 25 });


    foreach (DataEntry de in dataCollection)
    {
        ActiveList.Add(activeIndex++, de);
    }


    for (int i = 0; i < 5; i++)
    {
        ActiveList[0].DataTwo -= 2;
    }

    if (ActiveList[0].DataTwo < 25)
    {
        ActiveList.Remove(0);
    }

    foreach (DataEntry de in dataCollection)
    {
        ActiveList.Add(activeIndex++, de);
    }


}
4

3 に答える 3

2

ActiveListとの両方が同じインスタンスdataCollectionを指しています。DataEntry

Copyに挿入する前に、dataEntry のを作成する必要がありActiveListます。コピー コンストラクターの作成を参照してください。

次に、次のようにします。

foreach (DataEntry de in dataCollection)
{
    ActiveList.Add(activeIndex++, new DataEntry(de));
}
于 2013-02-06T05:35:06.447 に答える
1

DataEntry はクラスであるため、参照型です。List と Dictionary はどちらも、メモリ内のデータへの参照のコレクションと同じくらい、期待どおりのデータのコレクションではありません。したがって、両方のコレクションは同じ DataEntry アイテムを「指しています」。「リスト内」の dataEntry アイテムの値を変更すると、メモリ内のその単一のインスタンスが変更されます。「リスト コレクション内のアイテムと辞書アイテムが更新されている」と言うと、アイテムは 1 つだけで、両方のコレクションがそれを指しています。「参照型VS値型」などを検索してください...

編集: 値 + 参照型に関するこの記事をチェックしてください。この記事では、ヒープとスタックについても説明しています (詳細を説明する基本的なものです...) http://msdn.microsoft.com/en-us/magazine/cc301717. aspx

于 2013-02-06T05:37:00.247 に答える
0

Mitch が指摘したように、同じオブジェクトへの参照を格納しています。基本的に、一連のDataEntryオブジェクトを作成して に配置しますListが、 を構築するときDictionaryは、 にあるのと同じオブジェクトへの参照を追加しますList

// Create a DataEntry object
DataEntry de = new DataEntry() { DataOne = "Lakedoo", DataTwo = 25 };

// Add it to the List object
dataCollection.Add(de)

// Add it to the Dictionary object
ActiveList.Add(activeIndex++, de);

この時点で、オブジェクトは1 つ ですが、とDataEntryでオブジェクトへの参照が 2 つあります。どちらも同じオブジェクトを指しているため、どちらかに保存されているオブジェクトを変更すると、変更はすぐに他方に反映されます。ListDictionaryDataEntryListDictionary

DataEntryまた、クラスでコンストラクターを使用していない理由はありますか?

于 2013-02-06T05:38:14.957 に答える