2009-04-02 29 views
12

Giả sử chúng ta cóFlatten mảng trong PowerShell

$a = @(1, @(2, @(3))) 

tôi whould muốn flatten $ một để có được @ (1, 2, 3)

Tôi đã tìm thấy a solution

@($a | % {$_}).count 

Nhưng có thể có một cách thanh lịch hơn?

Trả lời

11

Đường ống là cách chính xác để làm phẳng cấu trúc lồng nhau, vì vậy tôi không chắc chắn sẽ là nhiều hơn "thanh lịch". Có, cú pháp là một chút nhìn nhiễu, nhưng thẳng thắn khá hữu ích.

+0

Đường ống đến '%' hoạt động, nhưng không phải đường ống để đo đối tượng hoặc '?'. Nó phải là do cách '%' xử lý đầu vào từ một đường ống, thay vì bản thân đường ống. – jpaugh

9

Cùng mã, chỉ cần bọc trong chức năng:

function Flatten($a) 
{ 
    ,@($a | % {$_}) 
} 

Thử nghiệm:

function AssertLength($expectedLength, $arr) 
{ 
    if($ExpectedLength -eq $arr.length) 
    { 
     Write-Host "OK" 
    } 
    else 
    { 
     Write-Host "FAILURE" 
    } 
} 

# Tests 
AssertLength 0 (Flatten @()) 
AssertLength 1 (Flatten 1) 
AssertLength 1 (Flatten @(1)) 
AssertLength 2 (Flatten @(1, 2)) 
AssertLength 2 (Flatten @(1, @(2))) 
AssertLength 3 (Flatten @(1, @(2, @(3)))) 
+0

Điểm bắt đầu của dòng bằng dấu phẩy là gì? – anthonybell

+1

Tiền tố với một lực lượng dấu phẩy powershell để trả về một mảng ngay cả khi chỉ có một mục để trả về. Nếu không có dấu phẩy Powershell sẽ làm sáng tỏ mảng thành một đối tượng singe cùng loại với nội dung mảng. Điều này có thể rất khó hiểu đối với những người đến từ các ngôn ngữ mạnh mẽ khác. – CarlR

5

Bạn có thể sử dụng phương pháp String.Join NET của.

[String]::Join("",$array)