tablice są podstawową cechą większości języków programowania. Są one zbiorem wartości lub przedmiotów i dlatego są trudne do uniknięcia. Przyjrzyjmy się z bliska tablicom i wszystkim, co mają do zaoferowania.
- indeks stron
- co to jest tablica?,dopasuj
- All-eq
- dodawanie do tablic
- Plus równa się +=
- przypisanie do rurociągu
- silnie wpisane tablice
- lista ArrayList
- lista Ogólna
- lista
- usuń()
- więcej kolekcji
- tablice Pre-size
- tablice mnożące
- inicjalizacja za pomocą 0
- zagnieżdżone tablice
- write-output-noenumerate
- zwróć tablicę
Co to jest tablica?
zacznę od podstawowego opisu technicznego, czym są tablice i jak są używane przez większość języków programowania, zanim przejdę do innych sposobów, w jaki PowerShell z nich korzysta.
tablica jest strukturą danych, która służy jako zbiór wielu elementów. Można iterację nad tablicą lub uzyskać dostęp do poszczególnych elementów za pomocą indeksu. Tablica jest tworzona jako sekwencyjny fragment pamięci, w którym każda wartość jest przechowywana obok drugiej.
będę dotykał każdego z tych szczegółów, jak idziemy.,
podstawowe użycie
ponieważ tablice są tak podstawową cechą PowerShell, istnieje prosta składnia do pracy z nimi w PowerShell.
Utwórz tablicę za pomocą @()
pustą tablicę można utworzyć za pomocą@()
PS> $data = @() PS> $data.count 0
możemy utworzyć tablicę i zalążek jej wartości po prostu umieszczając je w @()
PS> $data = @('Zero','One','Two','Three') PS> $data.count 4 PS> $data Zero One Two Three
tablica ta ma 4 pozycje. Kiedy wywołujemy zmienną $data
, widzimy listę naszych pozycji., Jeśli jest to tablica łańcuchów, to będziemy mieli jedną linię na łańcuch.
możemy zadeklarować tablicę na wielu liniach. Przecinek jest w tym przypadku opcjonalny i ogólnie pomijany.
$data = @( 'Zero' 'One' 'Two' 'Three' )
wolę deklarować moje tablice w wielu liniach w ten sposób. Nie tylko staje się łatwiejszy do odczytania, gdy masz wiele elementów, ale także ułatwia porównanie z poprzednimi wersjami podczas korzystania z kontroli źródła.,
Inna składnia
powszechnie przyjmuje się, że @()
jest składnią do tworzenia tablicy, ale Listy rozdzielane przecinkami działają przez większość czasu.
$data = 'Zero','One','Two','Three'
Write-Output do tworzenia tablic
jedna fajna sztuczka, o której warto wspomnieć, to to, że możesz użyć Write-Output
do szybkiego tworzenia ciągów w konsoli.
$data = Write-Output Zero One Two Three
jest to przydatne, ponieważ nie musisz umieszczać cudzysłowów wokół łańcuchów, gdy parametr akceptuje łańcuchy., Nigdy bym tego nie zrobił w scenariuszu, ale to uczciwa gra na konsoli.
dostęp do elementów
teraz, gdy masz tablicę z elementami w niej, możesz chcieć uzyskać dostęp i zaktualizować te elementy.
Offset
aby uzyskać dostęp do poszczególnych elementów, używamy nawiasów z wartością offsetu zaczynającą się od 0. W ten sposób otrzymujemy pierwszą pozycję w naszej tablicy:
PS> $data = 'Zero','One','Two','Three' PS> $data Zero
powodem, dla którego używamy zero jest to, że pierwsza pozycja znajduje się na początku listy, więc używamy przesunięcia o 0 pozycji, aby do niej dotrzeć., Aby dostać się do drugiego elementu, musimy użyć przesunięcia 1, Aby pominąć pierwszy element.
PS> $data One
oznacza to, że ostatnia Pozycja znajduje się w offsecie 3.
PS> $data Three
Index
teraz możesz zobaczyć, dlaczego wybrałem wartości, które zrobiłem dla tego przykładu. Wprowadziłem to jako offset, ponieważ tak naprawdę to jest, ale ten offset jest częściej określany jako indeks. Indeks zaczynający się od 0
. W dalszej części tego artykułu nazwę offset indeksem.,
specjalne sztuczki indeksowe
w większości języków możesz podać tylko jedną liczbę jako indeks, a otrzymasz z powrotem jedną pozycję. PowerShell jest znacznie bardziej elastyczny. Możesz używać wielu indeksów jednocześnie. Udostępniając listę indeksów, możemy wybrać kilka pozycji.
PS> $data Zero Two Three
elementy zostaną zwrócone zgodnie z kolejnością podanych indeksów. Jeśli zduplikujesz indeks, otrzymasz ten element za każdym razem.,
PS> $data Three Zero Three
możemy określić ciąg liczb za pomocą wbudowanego operatora ..
.
PS> $data One Two Three
To działa również odwrotnie.
PS> $data Three Two One
możesz użyć wartości indeksu negitive do przesunięcia od końca. Więc jeśli potrzebujesz ostatniej pozycji na liście, możesz użyć -1
.,
PS> $data Three
poza granicami
w większości języków, jeśli spróbujesz uzyskać dostęp do indeksu elementu, który znajduje się poza końcem tablicy, otrzymasz jakiś typ błędu lub wyjątek. PowerShell po cichu nic Ci nie da.
PS> $null -eq $data True
nie można indeksować do tablicy null
Jeśli twoja zmienna jest $null
I spróbujesz zindeksować ją jak tablicę, otrzymasz wyjątek System.Management.Automation.RuntimeException
z Komunikatem Cannot index into a null array
.,
PS> $empty = $null SP> $empty Error: Cannot index into a null array.
upewnij się więc, że Twoje tablice nie są $null
zanim spróbujesz uzyskać dostęp do elementów wewnątrz nich.
Count
tablice i inne kolekcje mają właściwość count, która mówi, ile elementów znajduje się w tablicy.
PS> $data.count 4
PowerShell 3.0 dodał właściwość count do większości obiektów. możesz mieć pojedynczy obiekt i powinien on dawać liczbę 1
.,
PS> $date = Get-Date PS> $date.count 1
nawet ma właściwość count, z wyjątkiem tego, że zwraca 0
.
PS> $null.count 0
są tu pewne pułapki, które będę ponownie sprawdzał, gdy sprawdzam$null
lub puste tablice później w tym artykule.
wyłączony przez jeden błąd
powstaje powszechny błąd programowania, ponieważ tablice rozpoczynają się od indeksu 0. Wyłączenie przez jeden błąd może być wprowadzone na dwa bardzo powszechne sposoby.,
pierwszy polega na tym, że myśląc, że chcesz mieć 2.pozycję i używając indeksu2
I naprawdę otrzymujesz 3. pozycję. Lub myśląc ,że masz4
elementy i chcesz ostatnią pozycję, więc po prostu Użyj rozmiaru, aby uzyskać dostęp do ostatniej pozycji.
$data
PowerShell z przyjemnością Ci na to pozwoli i poda ci dokładnie, jaki element istnieje w indeksie 4, $null
. Powinieneś używać $data.count - 1
lub -1
, o których dowiedzieliśmy się powyżej.,
PS> $data Three
tutaj możesz użyć indeksu -1
aby uzyskać ostatni element.
PS> $data Three
Lee Dailey wskazał mi również, że możemy użyć $data.GetUpperBound(0)
aby uzyskać maksymalny Numer indeksu.
PS> $data.GetUpperBound(0) Three
drugim najczęstszym sposobem jest iteracja listy i nie zatrzymywanie się we właściwym czasie. Powtórzę to, gdy mówimy o użyciu pętli for
.,
aktualizowanie pozycji
możemy użyć tego samego indeksu do aktualizacji istniejących pozycji w tablicy. Daje nam to bezpośredni dostęp do aktualizacji poszczególnych elementów.
$data = 'dos' $data = 'tres'
jeśli spróbujemy zaktualizować element, który jest poza ostatnim elementem, to otrzymamy błąd Index was outside the bounds of the array.
.
wrócę do tego później, gdy będę mówił o tym, jak powiększyć tablicę.
iteracja
w pewnym momencie będziesz musiał przejść lub iterować całą listę i wykonać jakąś akcję dla każdego elementu w tablicy.,
Pipeline
tablice i pipeline PowerShell są przeznaczone dla siebie. Jest to jeden z najprostszych sposobów przetwarzania tych wartości. Gdy przekazujesz tablicę do potoku, każdy element wewnątrz tablicy jest przetwarzany indywidualnie.
PS> $data = 'Zero','One','Two','Three' PS> $data | ForEach-Object {"Item: "} Item: Item: Item: Item:
Jeśli nie widziałeś$PSItem
wcześniej, po prostu wiedz, że jest to to samo, co$_
. Możesz użyć jednego z nich, ponieważ oba reprezentują bieżący obiekt w potoku.,
pętla ForEach
pętlaForEach
dobrze współpracuje ze zbiorami. Używając składni: foreach ( <variable> in <collection> )
foreach ( $node in $data ) { "Item: " }
metoda ForEach
zazwyczaj zapominam o tej metodzie, ale działa dobrze przy prostych operacjach. PowerShell pozwala na wywołanie.ForEach()
na kolekcji.
PS> $data.foreach({"Item "}) Item Item Item Item
.foreach()
pobiera parametr, który jest blokiem skryptu. Możesz upuścić nawiasy i po prostu podać blok skryptu.,
$data.foreach{"Item "}
jest to mniej znana składnia, ale działa tak samo. Ta metodaforeach
została dodana w PowerShell 4.0.
dla pętli
for
pętla jest często używana w większości innych języków, ale nie widzisz jej zbyt często w PowerShell. Kiedy go widzisz, często jest to w kontekście chodzenia po tablicy.
for ( $index = 0; $index -lt $data.count; $index++) { "Item: " -f $data }
pierwszą rzeczą, którą robimy, jest zainicjowanie$index
do0
., Następnie dodajemy warunek, że$index
musi być mniejszy niż$data.count
. Na koniec określamy, że za każdym razem, gdy zapętlamy, że Me musi zwiększyć Indeks o1
. W tym przypadku$index++
jest skrótem od$index = $index + 1
.
za każdym razem, gdy używasz pętlifor
, zwróć szczególną uwagę na warunek. Użyłem tutaj $index -lt $data.count
. Bardzo łatwo jest uzyskać warunek nieco źle, aby uzyskać off przez jeden błąd w logice., Używanie $index -le $data.count
lub$index -lt ($data.count - 1)
jest zawsze tak lekko błędne. To spowoduje, że wynik przetworzy zbyt wiele lub zbyt mało elementów. Jest to klasyk wyłączony przez jeden błąd.
pętla przełącznika
jest to jedna, która jest bardzo łatwa do przeoczenia. Jeśli podasz tablicę do instrukcji switch, będzie ona pasowała do każdej pozycji w tablicy.
$data = 'Zero','One','Two','Three' switch( $data ) { 'One' { 'Tock' } 'Three' { 'Tock' } Default { 'Tick' } }
wygeneruje to wyjście:
Tick Tock Tick Tock
istnieje wiele fajnych rzeczy, takich jak to, które możemy zrobić za pomocą polecenia switch., Mam inny artykuł poświęcony temu.
- wszystko, co kiedykolwiek chciałeś wiedzieć o instrukcji switch
aktualizowanie wartości
gdy Twoja tablica jest zbiorem łańcuchów lub liczb całkowitych (typów wartości), czasami będziesz chciał zaktualizować wartości w tablicy podczas ich pętli. Większość powyższych pętli używa zmiennej w pętli, która przechowuje kopię wartości. Jeśli zaktualizujesz tę zmienną, oryginalna wartość w tablicy nie zostanie zaktualizowana.
wyjątkiem od tej instrukcji jest pętla for
., Jeśli chcesz przejść przez tablicę i zaktualizować wartości wewnątrz niej, to pętla for
jest tym, czego szukasz.
for ( $index = 0; $index -lt $data.count; $index++ ) { $data = "Item: " -f $data }
Ten przykład pobiera wartość według indeksu, wprowadza kilka zmian, a następnie używa tego samego indeksu, aby przypisać ją z powrotem.
Tablice obiektów
do tej pory jedyne, co umieściliśmy w tablicy, to typ wartości, ale tablice mogą również zawierać obiekty.
$data = @( @{FirstName='Kevin';LastName='Marquette'} @{FirstName='John'; LastName='Doe'} )
wiele cmdletów zwraca kolekcje obiektów jako tablice po przypisaniu ich do zmiennej.,
$processList = Get-Process
wszystkie podstawowe funkcje, o których już mówiliśmy, nadal mają zastosowanie do tablic obiektów z kilkoma szczegółami, na które warto zwrócić uwagę.
dostęp do właściwości
możemy użyć indeksu, aby uzyskać dostęp do poszczególnych pozycji w kolekcji, tak jak w przypadku typów wartości.
PS> $data FirstName LastName ----- ---- Kevin Marquette
możemy uzyskać dostęp i aktualizować właściwości bezpośrednio.,
PS> $data.FirstName Kevin PS> $data.FirstName = 'Jay' PS> $data FirstName LastName ----- ---- Jay Marquette
właściwości tablicy
normalnie musisz wyliczyć całą listę w ten sposób, aby uzyskać dostęp do wszystkich właściwości:
PS> $data | ForEach-Object {$_.LastName} Marquette Doe
lub za pomocą Select-Object -ExpandProperty
cmdlet.
PS> $data | Select-Object -ExpandProperty LastName Marquette Doe
ale PowerShell oferuje nam możliwość żądania LastName
bezpośrednio. PowerShell wyliczy je za nas i da nam czystą listę.,
PS> $data.LastName Marquette Doe
wyliczenie nadal się dzieje, ale nie widzimy złożoności za nim.
gdzie-filtrowanie obiektów
tutaj pojawia się Where-Object
, dzięki czemu możemy filtrować i wybierać to, co chcemy z tablicy na podstawie właściwości obiektu.
PS> $data | Where-Object {$_.FirstName -eq 'Kevin'} FirstName LastName ----- ---- Kevin Marquette
możemy napisać to samo zapytanie w ten sposób, aby uzyskać FirstName
szukamy.,
$data | Where FirstName -eq Kevin
gdzie ()
tablice mają na nich metodę Where()
, która pozwala określić scriptblock
dla filtra.
$data.Where({$_.FirstName -eq 'Kevin'})
Ta funkcja została dodana w PowerShell 4.0.
aktualizowanie obiektów w pętlach
z typami wartości, jedynym sposobem aktualizacji tablicy jest użycie pętli for, ponieważ musimy znać indeks, aby zastąpić wartość. Mamy więcej opcji z obiektami, ponieważ są to typy referencyjne., Oto szybki przykład:
foreach($person in $data) { $person.FirstName = 'Kevin' }
ta pętla przechodzi przez każdy obiekt w tablicy$data
. Ponieważ obiekty są typami referencyjnymi, zmienna $person
odwołuje się do dokładnie tego samego obiektu, który znajduje się w tablicy. Tak więc aktualizacje jego właściwości zaktualizują oryginał.
nadal nie można zastąpić w ten sposób całego obiektu. Jeśli spróbujesz przypisać nowy obiekt do zmiennej $person
, zaktualizujesz odniesienie do zmiennej o coś innego, co nie wskazuje już na oryginalny obiekt w tablicy., To nie będzie działać tak, jak można się spodziewać:
foreach($person in $data) { $person = @{ FirstName='Kevin' LastName='Marquette' } }
operatory
operatory w PowerShell działają również na tablicach. Niektóre z nich działają nieco inaczej.
-join
operator-join
jest najbardziej oczywisty, więc przyjrzymy się mu najpierw. Podoba mi się operator -join
I często go używam. Połączy wszystkie elementy tablicy z określonym znakiem lub ciągiem znaków.,
PS> $data = @(1,2,3,4) PS> $data -join '-' 1-2-3-4 PS> $data -join ',' 1,2,3,4
jedną z funkcji, które lubię w -join
operator jest to, że obsługuje pojedyncze elementy.
PS> 1 -join '-' 1
używam tego wewnątrz logowania i komunikatów.
PS> $data = @(1,2,3,4) PS> "Data is $($data -join ',')." Data is 1,2,3,4.
-join $array
Oto sprytna sztuczka, na którą zwrócił mi uwagę Lee Dailey., Jeśli kiedykolwiek chcesz dołączyć wszystko bez ogranicznika, zamiast tego:
PS> $data = @(1,2,3,4) PS> $data -join $null 1234
możesz użyć -join
z tablicą jako parametrem bez prefiksu. Spójrz na ten przykład, aby zobaczyć, że mówię o.
PS> $data = @(1,2,3,4) PS> -join $data 1234
-replace and-split
Inne operatory, takie jak -replace
I -split
będą uruchamiane na każdym elemencie w tablicy. Nie mogę powiedzieć, że kiedykolwiek używałem ich w ten sposób, ale oto przykład.,
PS> $data = @('ATX-SQL-01','ATX-SQL-02','ATX-SQL-03') PS> $data -replace 'ATX','LAX' LAX-SQL-01 LAX-SQL-02 LAX-SQL-03
-zawiera
operator -contains
pozwoli Ci sprawdzić tablicę wartości, aby sprawdzić, czy zawiera ona określoną wartość.
PS> $data = @('red','green','blue') PS> $data -contains 'green' True
-w
gdy masz pojedynczą wartość, którą chcesz zweryfikować, możesz użyć operatora -in
. Wartość będzie po lewej, a tablica po prawej stronie operacji.,
PS> $data = @('red','green','blue') PS> 'green' -in $data True
może to być kosztowne, jeśli lista jest duża. Będę często używać wzoru regex, jeśli sprawdzam więcej niż 4-5 wartości.
PS> $data = @('red','green','blue') PS> $pattern = "^({0})$" -f ($data -join '|') PS> $pattern ^(red|green|blue)$ PS> 'green' -match $pattern True
-eq i-ne
równość i tablice mogą być skomplikowane. Gdy tablica znajduje się po lewej stronie, każdy element zostanie porównany. Zamiast zwracać True
, zwróci obiekt, który pasuje.,
PS> $data = @('red','green','blue') PS> $data -eq 'green' green
gdy użyjesz operatora -ne
, uzyskamy wszystkie wartości, które nie są równe naszej wartości.
PS> $data = @('red','green','blue') PS> $data -ne 'green' red blue
gdy używasz tego polecenia w instrukcjiif()
zwracana wartość toTrue
wartość. Jeżeli nie zostanie zwrócona żadna wartość, to jest to wartość False
. Obie te następne instrukcje zostaną ocenione do True
.,
$data = @('red','green','blue') if ( $data -eq 'green' ) { 'Green was found' } if ( $data -ne 'green' ) { 'And green was not found' }
wrócę do tego za chwilę, gdy porozmawiamy o testowaniu dla $null
.
-dopasuj
operator-match
spróbuje dopasować każdy element w kolekcji.
PS> $servers = @( 'LAX-SQL-01' 'LAX-API-01' 'ATX-SQL-01' 'ATX-API-01' ) PS> $servers -match 'SQL' LAX-SQL-01 ATX-SQL-01
gdy używasz-match
z pojedynczą wartością, specjalna zmienna$Matches
zostanie wypełniona informacjami o dopasowaniu. Nie dzieje się tak, gdy tablica jest przetwarzana w ten sposób.
możemy przyjąć to samo podejście z Select-String
.,
$servers | Select-String SQL
przyjrzałem się bliżejSelect-String
,-match
I$matches
w innym poście nazywa się wiele sposobów korzystania z regex.
$null lub empty
testowanie$null
lub pustych tablic może być trudne. Oto typowe pułapki z tablicami.
na pierwszy rzut oka to stwierdzenie wygląda na to, że powinno zadziałać.
if ( $array -eq $null) { 'Array is $null' }
ale właśnie przejrzałem, jak -eq
sprawdza każdy element w tablicy., Tak więc możemy mieć tablicę kilku elementów z pojedynczą wartością $null i będzie ona oceniana na $true
$array = @('one',$null,'three') if ( $array -eq $null) { 'I think Array is $null, but I would be wrong' }
dlatego najlepiej jest umieścić$null
po lewej stronie operatora. To sprawia, że ten scenariusz nie jest problemem.
if ( $null -eq $array ) { 'Array actually is $null' }
a $null
tablica nie jest tym samym co pusta tablica. Jeśli wiesz, że masz tablicę, sprawdź liczbę obiektów w niej., Jeśli tablica jest $null
, liczba będzie wynosić 0
.
if ( $array.count -gt 0 ) { 'Array is not empty' }
jest jeszcze jedna pułapka, na którą warto uważać. Możesz użyć count
nawet jeśli masz pojedynczy obiekt, chyba że ten obiekt jest PSCustomObject
. Jest to błąd, który został naprawiony w PowerShell 6.1. To dobra wiadomość, ale wiele osób nadal jest na 5.1 i trzeba na nią uważać.
PS> $object = @{Name='TestObject'} PS> $object.count $null
Jeśli nadal korzystasz z PowerShell 5.,1, możesz owinąć obiekt w tablicę przed sprawdzeniem liczby, aby uzyskać dokładną liczbę.
if ( @($array).count -gt 0 ) { 'Array is not empty' }
aby grać bezpiecznie, sprawdź , a następnie sprawdź liczbę.
if ( $null -ne $array -and @($array).count -gt 0 ) { 'Array is not empty' }
All-eq
ostatnio widziałem, jak ktoś zapytał, Jak sprawdzić, czy każda wartość w tablicy odpowiada podanej wartości. Użytkownik Reddit / u / bis miał to sprytne rozwiązanie, które sprawdza błędne wartości, a następnie odwraca wynik.,
$results = Test-Something if ( -not ( $results -ne 'Passed') ) { 'All results a Passed' }
dodawanie do tablic
w tym momencie zaczynasz zastanawiać się, jak dodać elementy do tablicy. Szybka Odpowiedź jest taka, że nie możesz. tablica to stały rozmiar w pamięci. Jeśli chcesz ją rozwinąć lub dodać do niej pojedynczy element, musisz utworzyć nową tablicę i skopiować wszystkie wartości ze starej tablicy. Brzmi to drogo i jak dużo pracy, jednak PowerShell ukrywa złożoność tworzenia nowej tablicy.
dodawanie tablicy
możemy użyć operatora dodawania z tablicami do utworzenia nowej tablicy., Więc biorąc pod uwagę te dwie tablice:
$first = @( 'Zero' 'One' ) $second = @( 'Two' 'Three' )
możemy dodać je razem, aby uzyskać nową tablicę.
PS> $first + $second Zero One Two Three
Plus równa się +=
możemy utworzyć nową tablicę i dodać do niej element w następujący sposób:
$data = @( 'Zero' 'One' 'Two' 'Three' ) $data += 'four'
Po prostu pamiętaj, że za każdym razem, gdy używasz +=
, duplikujesz i tworzysz nową tablicę. Nie jest to problem dla małych zbiorów danych, ale skaluje się bardzo słabo.,
przypisanie potoku
możesz przypisać wyniki dowolnego potoku do zmiennej. Będzie to tablica, jeśli zawiera wiele elementów.
$array = 1..5 | ForEach-Object { "ATX-SQL-$PSItem" }
zwykle, gdy myślimy o użyciu potoku, myślimy o typowych jednowierszach PowerShell. Możemy wykorzystać potok za pomocą instrukcji foreach()
I innych pętli. Tak więc zamiast dodawać elementy do tablicy w pętli, możemy upuścić elementy do potoku.,
$array = foreach ( $node in (1..5)) { "ATX-SQL-$node" }
przypisując wyniki foreach
do zmiennej, przechwytujemy wszystkie obiekty i tworzymy jedną tablicę.
typy tablic
domyślnie tablica w PowerShell jest tworzona jako typ ]
. Dzięki temu może zawierać dowolny typ obiektu lub wartości. To działa, ponieważ wszystko jest dziedziczone z typu PSObject
.
Tablice silnie wpisywane
możesz utworzyć tablicę dowolnego typu używając podobnej składni., Tablica silnie wpisana może zawierać tylko wartości lub obiekty określonego typu.
ArrayList
dodawanie elementów do tablicy jest jednym z jej największych ograniczeń, ale istnieje kilka innych kolekcji, do których możemy się zwrócić, aby rozwiązać ten problem.
ArrayList
jest powszechnie jedną z pierwszych rzeczy, o których myślimy, gdy potrzebujemy tablicy, która jest szybsza do pracy. Działa jak tablica obiektów w każdym miejscu, w którym jej potrzebujemy, ale szybko obsługuje dodawanie elementów.
oto jak tworzymy ArrayList
I dodajemy do niego elementy.,
$myarray = ::new() $myArray.Add('Value')
wywołujemy do.Net, aby uzyskać ten typ. W tym przypadku używamy domyślnego konstruktora do jego utworzenia. Następnie wywołujemy metodę Add
aby dodać do niej element.
powodem, dla którego używam na początku linii jest wyłączenie kodu zwrotnego. Niektóre wywołania. Net zrobią to i mogą stworzyć nieoczekiwane wyjście.
Jeśli jedynymi danymi, które posiadasz w swojej tablicy są StringBuilder, to spójrz również na StringBuilder., To prawie to samo, ale ma kilka metod, które są tylko do czynienia z ciągami. StringBuilder
jest specjalnie zaprojektowany dla wydajności.
- łączenie łańcuchów za pomocą StringBuilder
bardzo często zdarza się, że ludzie przenoszą się doArrayList
z tablic. Ale pochodzi z czasów, w których C# nie miało ogólnego wsparcia., ArrayList
jest wspierana przez generycznąList
listę generyczną
Typ generyczny to specjalny typ W C#, który definiuje klasę uogólnioną, a użytkownik określi typy danych, których będzie używał podczas tworzenia. Więc jeśli chcesz listę liczb lub łańcuchów, zdefiniuj, że chcesz listę typówint
lubstring
.
oto jak tworzysz listę ciągów.
$mylist = ]::new()
lub lista liczb.,
$mylist = ]::new()
możemy wrzucić istniejącą tablicę do takiej listy bez uprzedniego tworzenia obiektu:
$mylist = ]@(1,2,3)
możemy skrócić składnię za pomocą
div id=”b58d16b428″ >
instrukcja w PowerShell 5 i nowszych. Instrukcjausing
musi być pierwszą linią skryptu. Deklarując przestrzeń nazw, PowerShell pozwoli Ci pozostawić ją poza typami danych podczas odwoływania się do nich.,
using namespace System.Collections.Generic $myList = ]@(1,2,3)
To sprawia, że List
jest znacznie bardziej użyteczny.
masz do dyspozycji podobnąAdd
metodę. W przeciwieństwie do ArrayList, nie ma zwracanej wartości Add
metoda więc nie musimy void
to.
$myList.Add(10)
i nadal możemy uzyskać dostęp do elementów, tak jak inne tablice.,
PS> $myList 10
lista
możesz mieć listę dowolnego typu, ale jeśli nie znasz typu obiektów, możesz użyć]
, aby je zawierać.
Usuń ()
ArrayList
I ogólny List
oba obsługują usuwanie elementów z kolekcji.
using namespace System.Collections.Generic $myList = ]@('Zero','One','Two','Three') $myList.Remove("Two") Zero One Three
podczas pracy z typami wartości usunie pierwszy z listy., Możesz go wywoływać w kółko, aby usunąć tę wartość. Jeśli masz typy odniesień, musisz podać obiekt, który chcesz usunąć.
]$drives = Get-PSDrive $drives.remove($drives)
$delete = $drives $drives.remove($delete)
metoda remove zwróci true, jeśli udało się znaleźć i usunąć element z kolekcji.
więcej kolekcji
istnieje wiele innych kolekcji, które mogą być używane, ale są to dobre ogólne zamienniki tablic., Jeśli chcesz dowiedzieć się więcej o tych opcjach, spójrz na ten Gist, który stworzył Mark Kraus.
inne niuanse
teraz, gdy omówiłem wszystkie główne funkcje, oto kilka innych rzeczy, o których chciałem wspomnieć, zanim to zakończę.
Pre-size tablic
wspomniałem, że nie można zmienić rozmiaru tablicy po jej utworzeniu. Możemy utworzyć tablicę o wstępnie ustalonym rozmiarze, wywołując ją konstruktoremnew($size)
.,
$data = ]::new(4) $data.count 4
mnożenie tablic
ciekawą sztuczką jest to, że można pomnożyć tablicę przez liczbę całkowitą.
PS> $data = @('red','green','blue') PS> $data * 3 red green blue red green blue red green blue
Inicjalizuj za pomocą 0
powszechnym scenariuszem jest utworzenie tablicy ze wszystkimi zerami. Jeśli masz mieć tylko liczby całkowite, silnie wpisana tablica liczb całkowitych będzie domyślnie ustawiona na wszystkie zera.
PS> ]::new(4) 0 0 0 0
w tym celu możemy użyć sztuczki z mnożeniem.,
PS> $data = @(0) * 4 PS> $data 0 0 0 0
fajną rzeczą w sztuczce z mnożeniem jest to, że możesz użyć dowolnej wartości. Więc jeśli wolisz mieć 255
jako wartość domyślną, byłby to dobry sposób, aby to zrobić.
PS> $data = @(255) * 4 PS> $data 255 255 255 255
zagnieżdżone tablice
tablica wewnątrz tablicy nazywa się zagnieżdżoną tablicą. Nie używam ich dużo w PowerShell, ale używałem ich więcej w innych językach. Rozważ użycie tablicy tablic, gdy dane pasują do wzorca podobnego do siatki.
oto dwa sposoby na utworzenie dwuwymiarowej tablicy.,
$data = @(@(1,2,3),@(4,5,6),@(7,8,9)) $data2 = @( @(1,2,3), @(4,5,6), @(7,8,9) )
przecinek jest bardzo ważny w tych przykładach. Podałem wcześniejszy przykład zwykłej tablicy na wielu liniach, gdzie przecinek był opcjonalny. Tak nie jest w przypadku tablicy wielowymiarowej.
sposób, w jaki używamy notacji indeksu zmienia się nieco teraz, gdy mamy zagnieżdżoną tablicę. Używając $data
powyżej, w ten sposób uzyskamy dostęp do wartości 3.
PS> $outside = 0 PS> $inside = 2 PS> $data 3
Dodaj zestaw nawiasów dla każdego poziomu zagnieżdżania tablicy., Pierwszy zestaw nawiasów jest dla zewnętrznej tablicy most, a następnie pracujesz swoją drogę stamtąd.
Write-Output-NoEnumerate
PowerShell lubi rozpakowywać lub wyliczać tablice. Jest to podstawowy aspekt sposobu, w jaki PowerShell używa potoku, ale czasami nie chcesz, aby tak się stało.
Zwykle przesyłam obiekty doGet-Member
, aby dowiedzieć się więcej o nich. Kiedy przesyłam do niej tablicę, zostaje ona rozpakowana i Get-Member widzi elementy tablicy, a nie rzeczywistą tablicę.,
PS> $data = @('red','green','blue') PS> $data | Get-Member TypeName: System.String ...
aby zapobiec rozpakowaniu tablicy, możesz użyć Write-Object -NoEnumerate
.
PS> Write-Output -NoEnumerate $data | Get-Member TypeName: System.Object ...
mam drugi sposób, aby to zrobić, że jest to bardziej hack (i staram się unikać hacków takich jak ten). Przed tablicą można umieścić przecinek przed nim.
PS> ,$data | Get-Member TypeName: System.Object ...
zwraca tablicę
To un-zawijanie tablic ma również miejsce, gdy wypisujesz lub zwracasz wartości z funkcji., Nadal można uzyskać tablicę, jeśli przypisano wyjście do zmiennej, więc nie jest to zwykle problem.
haczyk polega na tym, że będziesz miał nową tablicę. Jeśli jest to kiedykolwiek problem, możesz użyć Write-Output -NoEnumerate $array
lub return ,$array
, aby obejść ten problem.
coś jeszcze?
wiem, że to dużo do ogarnięcia. Mam nadzieję, że nauczysz się czegoś z tego artykułu za każdym razem, gdy go przeczytasz i że okaże się to dobrym punktem odniesienia dla ciebie przez długi czas., Jeśli uważasz, że jest to pomocne, podziel się nim z innymi, którzy Twoim zdaniem uzyskają z tego wartość.
z tego miejsca polecam zapoznać się z podobnym postem, który napisałem o hashtables.