2013-02-20 3 views
1

Я так смущен. Я не могу понять, почему 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?

ответ

3

Конвейер PowerShell будет «разворачивать» массивы и коллекции (один уровень), но не хеш-таблицы. Если вы хотите перечислить пары ключ-значение в хэш-таблице в PowerShell, вызовите метод .GetEnumerator():

$ht = @{a=1;b=2} 
$ht.GetEnumerator() 



Name       Value                
----       -----                
a        1                 
b        2  
+0

Yay, это то, что мне было нужно, спасибо! Кстати, как вы это знаете? Есть ли документ, который объясняет разворот? Я даже не думал использовать это ключевое слово в моих поисках, хотя теперь, когда я это знаю, я вижу много хитов. – scobi

+2

Я не помню, где я впервые узнал об этом, или если это было путем открытия, но вы можете легко убедиться в этом сами. Создайте 2D-массив и отправьте его по конвейеру в foreach-object. Каждый объект будет одним из массивов второго уровня. – mjolinor

+0

Действительно, если вы хотите предотвратить разворачивание массивов трубопроводов, вам необходимо передать префикс запятой, например:, @ (1,2,3), который затем передает весь массив как единый объект конвейера, а не итерирует содержимое , (Лично я считаю, что разматывание крайне раздражает, и, похоже, всегда было противоположностью того, что я хотел, но кто знает, может быть, я просто не пользуюсь этой функциональностью оптимально) –

Смежные вопросы