2

私のコードのスニペット

List<List<optionsSort>> stocks = new List<List<optionsSort>>();
optionsSort tempStock1 = new optionsSort();
List<optionsSort> stock = new List<optionsSort>();

次に、いくつかのコード、

for (int j = 1; j < optionsSt.Count; j++)
{

            if (optionsSt[j].isin == optionsSt[j - 1].isin)
            {

                tempStock1.name = optionsSt[j].name;
                tempStock1.date = optionsSt[j].date;
                tempStock1.strike = optionsSt[j].strike;
                tempStock1.size = optionsSt[j].size;
                tempStock1.isin = optionsSt[j].isin;
                tempStock1.callPut = optionsSt[j].callPut;

                stock.Add(tempStock1);

            }
            else
            {

                stocks.Add(stock);

                k = k + 1;
                stock.Clear();

                tempStock1.name = optionsSt[j].name;
                tempStock1.date = optionsSt[j].date;
                tempStock1.strike = optionsSt[j].strike;
                tempStock1.size = optionsSt[j].size;
                tempStock1.isin = optionsSt[j].isin;
                tempStock1.callPut = optionsSt[j].callPut;

                stock.Add(tempStock1);



            }




        }//endfor

基本的に、大きなリストを調べて、要素をグループに並べ替えます。新しいリスト名がストックされます。

問題は、リスト在庫に含まれるすべての要素を在庫に追加し、次の行で在庫をクリアして再び開始すると、在庫に保存したすべての要素を削除することです。

何か案は。stocks[i].Add(stock) のような株式にインデックスを付けて、同様の株式の各ブロックが株式の要素になるようにする必要がありますか。

助けてくれてありがとう。

4

2 に答える 2

3

新しいリストを作成するのではなく、1 つのリストを使用し、それを埋めては繰り返しクリアします。外側のリストには 1 つのリストしか含まれず、複数回繰り返されるため、そのリストはすべてのインスタンスで同じ内容になります。つまり、リストをクリアすると、外側のリスト内からアクセスしようとしても、古いコンテンツにアクセスできなくなります。

あなたがする必要があるのは、この行を変更することです:

stock.Clear();

これに:

stock = new List<optionsSort>();

それがあなたの本当の意味です。:)

于 2013-07-20T14:34:21.287 に答える
3

問題はList<T>、.NET のすべてのクラスと同様に、オブジェクトが参照型であることです。つまり、追加stockするたびに新しいstocksリストを追加するのではなく、メモリ内の同じリストへの参照を追加するだけです。したがって、後で を呼び出すと、変数と 内の他のすべての参照の両方に反映されます。Clearstockstocks

stockに追加するたびにの浅いコピーを作成することで、これを解決できますstocks

stocks.Add(stock.ToList());
于 2013-07-20T13:51:24.860 に答える