Я не думаю, что производительность будет отличаться, но если вы ищете краткость:
var q = from person in people
join car in cars on person.CarId equals car.CarId
select new { car, person };
foreach(var o in q)
{
o.car.Person = o.person;
}
Редактировать: После намека Джона на то, что эта версия быстрее, я получил любопытство и профилировал обе функции. Эта версия кажется в два раза быстрее, что удивительно. Я проверил разборку. Издержки исходной реализации, похоже, связаны с созданием новых перечислителей как для внешнего, так и для внутреннего цикла, что приводит к накладным расходам P / new / dispose.
Для этого кода создан только один перечислитель, который, я думаю, является магией функции "Присоединиться". Хотя я не проверял, как это работает.