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
  • $null lub empty
    • All-eq
  • dodawanie do tablic
    • dodawanie do tablic
    • Plus równa się +=
    • przypisanie do rurociągu
  • typy tablic
    • silnie wpisane tablice
    • lista ArrayList
    • lista Ogólna
      • lista
      • usuń()
    • więcej kolekcji
  • inne niuanse
    • tablice Pre-size
    • tablice mnożące
    • inicjalizacja za pomocą 0
    • zagnieżdżone tablice
    • write-output-noenumerate
      • zwróć tablicę
  • coś jeszcze?,
  • 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.RuntimeExceptionz 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$nulllub 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ś$PSItemwcześ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$indexdo0., Następnie dodajemy warunek, że$indexmusi 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.countlub$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 -replaceI -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-matchz pojedynczą wartością, specjalna zmienna$Matcheszostanie 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,-matchI$matchesw 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., ArrayListjest 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. Instrukcjausingmusi 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.

    Dodaj komentarz

    Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *