Я так смущен. Я не могу понять, почему foreach в Powershell ведет себя так иначе, как C#.Перечисления в Powershell против труб
Этот простой код не производит никакого вывода:
@{a=1; b=2} | %{ $_.key }
Аппроксимация этого я сделал в LINQPad с использованием C# дает выход я бы ожидать:
var ht = new Hashtable();
ht["a"] = 1;
ht["b"] = 2;
foreach (DictionaryEntry kvp in ht)
{
kvp.Key.Dump();
}
// output
a
b
Если я перечисляю элемент Ключи хэш-таблицу, я могу делать то, что мне нужно. Но я не понимаю, почему перечисление самой хэш-таблицы не возвращает пары ключ-значение. Фактически, кажется, он возвращает сам объект:
> @{a=1; b=2} | %{ $_.gettype() }
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Hashtable System.Object
Что здесь делает Powershell?
Yay, это то, что мне было нужно, спасибо! Кстати, как вы это знаете? Есть ли документ, который объясняет разворот? Я даже не думал использовать это ключевое слово в моих поисках, хотя теперь, когда я это знаю, я вижу много хитов. – scobi
Я не помню, где я впервые узнал об этом, или если это было путем открытия, но вы можете легко убедиться в этом сами. Создайте 2D-массив и отправьте его по конвейеру в foreach-object. Каждый объект будет одним из массивов второго уровня. – mjolinor
Действительно, если вы хотите предотвратить разворачивание массивов трубопроводов, вам необходимо передать префикс запятой, например:, @ (1,2,3), который затем передает весь массив как единый объект конвейера, а не итерирует содержимое , (Лично я считаю, что разматывание крайне раздражает, и, похоже, всегда было противоположностью того, что я хотел, но кто знает, может быть, я просто не пользуюсь этой функциональностью оптимально) –