После запуска этого кода:
var input = new List<T>( ... );
var result = input.Select( t => new U(t) );
U first1 = null;
foreach ( U u1 in result )
if ( first1 == null )
first1 = u1;
U first2 = null;
foreach ( U u2 in result )
if ( first2 == null )
first2 = u2;
Затем 'first1 == first2' оценивается как false, хотя оба U обертывают один и тот же T. Я еще не проверял это, но я думаю, что его можно заставить оценить как true, объединив .ToList() или .ToArray() на вызов Select().
В реальном коде, который намного сложнее, чем эта простая иллюстрация, какое хорошее эмпирическое правило следует использовать для принятия решения о том, следует ли добавлять .ToList() или .ToArray()? Мои первоначальные мысли — либо любое выражение, на которое ссылаются, которое может повторяться более одного раза, либо, чтобы быть более безопасным, в случае, если потенциальные итерации не очевидны, любое выражение, на которое ссылаются, результат которого никогда не изменится.
first1 == first2
ложно? Повторение одной и той же коллекции должно каждый раз возвращать одни и те же объекты. - person Peter Gluck   schedule 18.08.2012U
использует стандартное равенство ссылок. Каждая итерация вызывает переоценку последовательности, поэтому вы получаете новыеU
экземпляра. - person Reed Copsey   schedule 18.08.2012new U
каждый раз, когда перебираете коллекцию? Или тот новыйU(t) != new U(t)
? У лени есть последствия. Желательны эти последствия или нет, зависит от варианта использования. - person Martijn   schedule 01.05.2015