2016-08-08 5 views
-2

Когда я запускаю простой код, предназначенный, чтобы сделать обучение и тестирование данных перекрестной проверки, я итерацию по каждому пункту моего списка, но каждый раз, когда он перебирает список уменьшается на 1.Когда я повторяю счет, мой массив меняет размер, почему?

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

О, оказывается, я поддержал не того человека! – woofwoof

ответ

2

Вы удаления элемент массива, когда вы вызываете trainDataList.RemoveAt(i);. Это не то же самое, что очистка значения: trainDataList[i] = null;;

Давайте использовать пример реального мира. Представьте, что массив представляет собой серию чашек, выстроившихся на стол. Когда вы вызываете trainDataList.RemoveAt(i);, вы удаляете одну из чашек. Когда вы звоните trainDataList[i] = null;, вы оставляете там чашку, а просто выгружаете содержимое.

+0

Это очень очевидный ошибочный факт, который я благодарю за помощь! – woofwoof

+0

Но OP не вызывает 'RemoveAt' на' adjustData', а 'trainDeataList', который просто« отрегулированData [i] .ToArray() », поэтому некоторый тип подпоследовательности в' adjustData'. – juharr

+0

@juharr Нет, 'trainDataList = tempData' not' trainDataList = testData' –

4

Не следует ли, чтобы ваш код удалял элемент из массива/списка. Ниже строки кода

 trainDataList.RemoveAt(i); 
+0

Простите мое невежество, но это цикл 'for', сравнивающий' adjustData.Count'. Почему удаление из 'trainDataList' влияет на это? Это потому, что ему присваивается значение 'adjustData', и что удаление из' trainDataList' также удаляется из 'adjustData'? –

+0

На самом деле ... Непонятно. Я думал, он имел в виду, что цикл уменьшался на 1. Он просто означает «Список», я думаю. –

+1

@NickBull, типы ссылок ... да, так как 'var trainDataList = tempData;' и 'var tempData = adjustData;' – Rahul

0

Поскольку вы удаляете элемент, ваш размер массива изменяется

trainDataList.RemoveAt(i); 
0

Назначения:

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

не будет клонировать ваш список. Они просто копируют ссылку. Таким образом, у вас будет три ссылки на список.

Вы можете сделать (неглубокий) клон с:

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

Вызов .RemoveAt на клон не будет влиять на оригинал, так как это время у вас есть ссылки на различных список экземпляров.

Смежные вопросы