После запуска этого кода:
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(). Мои первоначальные мысли - это любое ссылочное выражение, которое может повторяться более одного раза или, чтобы быть более безопасным, если потенциальные итерации не являются очевидными, любое ссылочное выражение, результат которого никогда не изменится.