2016-08-08 6 views
-2

私はトレーニングやテストデータの相互検証を行うために設計されたシンプルなコードを実行すると、私は私のリストの各カウントを反復が、それは、リストを反復処理するたびに削除している1countを繰り返し実行すると、配列のサイズが変わるのはなぜですか?

for (var i = 0; i < adjustedData.Count; i++) 
     { 
      var tempData = adjustedData; 
      var testData = tempData[i].ToArray(); 
      var trainDataList = tempData; 
      trainDataList.RemoveAt(i); 
      var trainData = trainDataList.ToArray(); 
+0

ああ、私は間違った人をupvotedことが判明! – woofwoof

答えて

2

減少trainDataList.RemoveAt(i);を呼び出すと、配列の要素です。これは値をクリアするのと同じではありません:trainDataList[i] = null;;

実際の例を使用しましょう。配列は、テーブルに並べられた一連のカップであるとします。 trainDataList.RemoveAt(i);に電話すると、カップの1つが取り外されます。 trainDataList[i] = null;に電話すると、そこにカップを残していますが、内容をダンプするだけです。

+0

これは非常に明白な間違いです。私は助けてくれてありがとう! – woofwoof

+0

しかし、OPは 'adjustedData'では' RemoveAt'を呼び出すのではなく、 'adjustedData [i] .ToArray()'だけである 'trainDeataList'を呼び出すので、' adjustedData'の中のある種のサブシーケンスです。 – juharr

+0

@juharrいいえ、 'trainDataList = tempData'は' trainDataList = testData'ではありません。 –

4

あなたのコードが配列/リストから項目を削除していないはずはありません。以下のコード行

 trainDataList.RemoveAt(i); 
+0

私の無知を許してください。しかし、 'adjustedData.Count'を比較する' for'ループです。なぜ 'trainDataList'からの削除がそれに影響しますか?それは 'adjustedData'の値が割り当てられているので、' trainDataList'から削除すると 'adjustedData'も削除されますか? –

+0

ああ、実際には...誤解されています。私は彼がループが1だけ減少していることを意味していると思った。彼は単にリストを意味すると思う。 –

+1

@NickBull、参照型...はい、 'var trainDataList = tempData;'および 'var tempData = adjustedData;' – Rahul

0

あなたは項目を削除しているので、あなたの配列サイズが割り当て

trainDataList.RemoveAt(i); 
0

を変更します。

var tempData = adjustedData; 
// ... 
var trainDataList = tempData; 

はあなたのリストのクローンを作成しません。彼らは単にリファレンスをコピーします。したがって、同じリストへの3つの参照があります。

あなたはと(浅い)クローンを作ることができます。この時間はあなたが異なるリストインスタンスへの参照を持っているので、クローンに.RemoveAtを呼び出すと、元には影響を与えません

var tempData = adjustedData.ToList(); // using Linq 

関連する問題