В этом коде:
int[] z = new [] {1,2,3,4};
double[] result = z.Select(p => Log(p)).ToArray();
Большая часть, если не все, "Cruft", который вы видите, связана с использованием массивов, когда заголовок вопроса гласит: "Есть ли более чистый синтаксис для применения операции к каждому элементу последовательности * 1005?" *? "
В .NET 3.0 «последовательность» инкапсулируется с интерфейсом IEnumerable<>
.
Используя это, вы получите гораздо более чистый код:
IEnumerable<int> z = new[] {1, 2, 3, 4};
IEnumerable<double> result = z.Select(i => Math.Log(i));
Добавьте использование неявной типизации с помощью клавиш var , и все очень ясно:
var z = new[] {1, 2, 3, 4};
var result = z.Select(i => Math.Log(i));
Как правило, новые функции C # 3.0 (особенно LINQ) наиболее эффективно воспроизводятся при использовании List <> вместо Arrays.
Если у вас есть код, уже основанный на массивах, я бы предложил добавить перегрузки к вашему API, которые принимают IEnumerable вместо int [], позволяя потребляющему коду использовать возможности современного языка.