Что определяет, развернет ли конвейер Powershell набор?

Существует различие между ранней оптимизацией производительности и использованием типа лучшей практики правила. Если Вы составляете новые таблицы, где у Вас всегда будет поле фиксированной длины, имеет смысл использовать CHAR, необходимо использовать его в этом случае. Это не ранняя оптимизация, а скорее реализация эмпирического правила (или лучшая практика).

т.е. - если у Вас есть 2 поля состояния буквы, используйте CHAR (2). Если у Вас есть поле с именами реального положения, используйте VARCHAR.

9
задан Richard Berg 2 December 2009 в 02:36
поделиться

2 ответа

$ args развернут. Помните, что параметры функции обычно передаются с использованием пробела для их разделения. Когда вы передаете 1,2,3, вы передаете единственный аргумент, который представляет собой массив из трех чисел, который присваивается $ args [0]:

PS> function UnrollMe { $args }
PS> UnrollMe 1 2 3 | measure

Count    : 3

Помещение результатов (массива) в выражение группировки (или часть выражения например, $ () ) снова делает его пригодным для разворачивания, поэтому следующее разворачивает объект [], содержащий 1,2,3, возвращенный UnrollMe:

PS> ((UnrollMe 1,2,3) | measure).Count
3

, что эквивалентно:

PS> ((1,2,3) | measure).Count
3

BTW, это не ' t просто применить к массиву с одним элементом.

PS> ((1,2),3) | %{$_.GetType().Name}
Object[]
Int32

Использование подвыражения массива ( @ () ) для чего-то, что уже является массивом, не имеет никакого эффекта, независимо от того, сколько раз вы его применяете. : -) Если вы хотите предотвратить разворачивание, используйте оператор запятой, потому что он всегда создает другой внешний массив, который разворачивается. Обратите внимание, что в этом сценарии вы на самом деле не предотвращаете развертывание, вы просто обходите развертывание, вводя внешний массив «оболочку», который развертывается вместо вашего исходного массива, например:

PS> (,(1,2,3) | measure).Count
1

Наконец, когда вы выполняете это:

PS> (UnrollMe a,b,c d) | %{$_.GetType().Name}
Object[]
String

Вы можете видеть, что UnrollMe возвращает два элемента (a, b, c) как массив и d как скаляр. Эти два элемента передаются по конвейеру отдельно, в результате получается 2.

PS> (UnrollMe a,b,c d) | %{$_.GetType().Name}
Object[]
String

Вы можете видеть, что UnrollMe возвращает два элемента (a, b, c) как массив и d как скаляр. Эти два элемента передаются по конвейеру отдельно, в результате получается 2.

PS> (UnrollMe a,b,c d) | %{$_.GetType().Name}
Object[]
String

Вы можете видеть, что UnrollMe возвращает два элемента (a, b, c) как массив и d как скаляр. Эти два элемента передаются по конвейеру отдельно, в результате получается 2.

11
ответ дан 4 December 2019 в 19:34
поделиться

Похоже, это как-то связано с тем, как работает Measure-Object и как объекты передаются по конвейеру.

Когда вы говорите

1,2,3 | measure

, вы получаете 3 Объекты Int32, переданные в конвейер, объект измерения затем подсчитывает каждый объект, который он видит в конвейере.

Когда вы "разворачиваете его" с помощью своей функции, вы получаете один объект массива, переданный в конвейер, который считается объектом измерения как 1, он не пытается выполнить итерацию по объектам в массиве, как показано здесь:

PS C:\> (measure -input 1,2,3).count
1

Возможный обходной путь - «перевернуть» массив в конвейер с помощью foreach:

PS C:\> (UnrollMe 1,2,3 | %{$_} | measure).count
3
1
ответ дан 4 December 2019 в 19:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: