Добавляя к ответу @ dan-d, это, пожалуй, самый простой для чтения и более элегантный код:
double[] _results = _pages
.Select(page => _regex.Matches(page).Cast<Match>().Select(value => value.Groups["value"].Value))
.Select(value => value.TakeWhile(condition => !condition.Contains("(")).Last())
.Select(number => double.TryParse(number, out double _result) ? _result : _result)
.ToArray();
Первый select перебирает все страницы данных и возвращает массивы со всеми найденными значениями, используя регулярное выражение. Второй select находит последнее значение непосредственно перед условием (имеет ли значение круглые скобки) для каждой страницы; в то время как финальный select оценивает результаты, возвращая массив значений типа double.
Наконец, следуя предложению @ caius-jard, улучшение регулярного выражения теперь возвращает одно значение, что еще больше упрощает оператор linq до следующего:
double[] _results = _pages
.Select(page => _regex.Matches(page).Cast<Match>().Select(value => value.Groups["value"].Value).First())
.Select(number => double.TryParse(number, out double _result) ? _result : _result)
.ToArray();