Ответ 1
Это зависит от того, что называется, они являются отдельными проблемами.
.AsParallel()
Параллелирует перечисление не делегирование задач.
Parallel.ForEach
Параллельно цикл, назначая задачи рабочим потокам для каждого элемента.
Таким образом, если ваше перечисление источника не становится параллельным (например, reader.Match(file)
дорого), они равны. К вашему последнему вопросу, да, оба правильны.
Кроме того, есть еще одна конструкция, которую вы можете захотеть посмотреть, что немного сокращает ее, все еще получая максимальную выгоду от PLINQ:
GetFileList().Where(file => reader.Match(file)).ForAll(f => list.Add(f));