2017-01-30 2 views
-2

То, что я хочу сделать, это что-то вроде:Выберите подмножество списка на основе случайных величин

var rnd = new Random(); 
var list1Data = ...; //100 elements 
var list2Data = list1Data.Where(_ => rnd.NextDouble() > 0.1); 

Других слов, должны быть выбрано около 90% из пунктов списка, около 10% не ... он имитирует очень просто неисправное оборудование.

Но я получаю вместо этого 100% предметов. Как я могу это исправить?

UPDATE: , когда я смотрю в отладчике он показывает list2.Count такое же, как list1.Count НО когда я расширить представление результатов, он показывает меньше элементов ... т.е. это делать, как должно, но отладчик показывает запутанную информацию.

enter image description here

В этом примере расширяющегося Results View показывает около 90 элементов от запуска к запуску, но Count показывает 100.

Является ли это ошибка в System.Linq.Enumerable.WhereListIterator или моего непонимания?

+0

_ «Я думаю, что rnd.NextDouble() вызывается только один раз ...» _ - прочитайте [ask] и объясните свою проблему очень явно, включая [mcve]. Угадание не заставит вас очень далеко отсюда. Очевидно, вы заметили что-то, что заставляет вас так думать, но если вы не укажете свои наблюдения, а только свои мысли, мы не можем сказать ничего полезного. – CodeCaster

+0

Нет, ваше редактирование не помогает. Снова прочитайте [ask] и предоставьте [mcve]. Этот код вряд ли вернет содержимое 'list1' всего в' list2'. Опять же, предоставьте [mcve]. Вероятно, вы не используете 'rnd', а' new Random() 'в инструкции' Where() 'или что-то еще. – CodeCaster

+0

Что такое 'rnd'? Разве вы не воссоздаете экземпляр «Случайный» и, следовательно, имеете сильно искаженный экземпляр? –

ответ

1

Вы смотрите на WhereListIterator.source.Count.

Учитывая source поля содержит ссылку на List<T> он собирается перебрать, он показывает вам подсчета исходной коллекции, а не подсчет отфильтрованной коллекции.

Не существует свойства или поля, указывающего счетчик последнего, поскольку это известно только после итерации по всей коллекции источников, и это отложено до тех пор, пока вы на самом деле этого не сделаете, например, используя .

+0

Имеет смысл, спасибо. Полагаю, что мы часто добавляем '.ToList()' или подобное. Я был пойман отладчиком, изменяя поведение программы до того, как проверил структуры данных, связанные с отложенными результатами. –

+0

Да, это один из рисков при использовании отладчика в том, что должно быть выполнено в отложенном режиме. 'ToList()' обычно является хорошим подходом. – CodeCaster

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