- 10/08/2020
- 24 de minute pentru a citi
-
- j
- h
- s
- V
Matrice sunt o fundamentale de limbă caracteristică de cele mai multe limbaje de programare. Sunt o colecție de valori sau obiecte greu de evitat. Să aruncăm o privire atentă la matrice și la tot ceea ce eiau de oferit.,versiunea originală a acestui articol a apărut pe blogul scris de @KevinMarquette. Echipa ThePowerShell îi mulțumește lui Kevin că ne-a împărtășit acest conținut. Vă rugăm să verificați blogul său atPowerShellExplained.com.
ce este o matrice?
voi începe cu o descriere tehnică de bază a ceea ce sunt matrice și modul în care acestea sunt utilizate de cătrecele mai multe limbaje de programare înainte de a trece în alte moduri PowerShell face uz de ele.
o matrice este o structură de date care servește ca o colecție de mai multe elemente., Puteți itera peste thearray sau accesa elemente individuale folosind un index. Matricea este creată ca o bucată secvențială dememorie în care fiecare valoare este stocată chiar lângă cealaltă.
voi atinge fiecare dintre aceste detalii pe măsură ce mergem.
utilizare de bază
deoarece matricele sunt o caracteristică de bază a PowerShell, există o sintaxă simplă pentru lucrul cu Them în PowerShell.,
Crearea unui tablou
Un array gol poate fi creat prin utilizarea @()
PS> $data = @()PS> $data.count0
putem crea o matrice și semințe cu valori doar prin plasarea lor în @()
paranteze.
PS> $data = @('Zero','One','Two','Three')PS> $data.count4PS> $dataZeroOneTwoThree
această matrice are 4 elemente. Când apelăm variabila $data
, vedem lista articolelor noastre. Dacă este anarray de șiruri, atunci obținem o linie pe șir.
putem declara o matrice pe mai multe linii. Virgula este opțională în acest caz și, în general, la stânga.,
$data = @( 'Zero' 'One' 'Two' 'Three')
prefer să declar matricele mele pe mai multe linii de genul acesta. Nu numai că devine mai ușor de citit cândaveți mai multe elemente, ci și mai ușor de comparat cu versiunile anterioare atunci când utilizați sourcecontrol.
Alte sintaxa
este de obicei înțeles că @()
este sintaxa pentru crearea unei matrice, dar separate prin virgulă listswork cele mai multe ori.,
$data = 'Zero','One','Two','Three'
Scrie-Ieșire pentru a crea tablouri
Un mic truc demn de menționat este faptul că puteți folosi Write-Output
pentru a crea rapid stringsat consola.
$data = Write-Output Zero One Two Three
Acest lucru este util pentru că nu trebuie să puneți ghilimele în jurul șirurilor atunci când parametrul acceptstrings. Nu aș face niciodată acest lucru într-un scenariu, dar este un joc corect în consolă.
accesarea elementelor
acum că aveți o matrice cu elemente în ea, poate doriți să accesați și să actualizați aceste elemente.,pentru a accesa elementele individuale, folosim parantezele cu o valoare offset începând de la 0. Acest ishow am primit primul produs în oferta noastră:
PS> $data = 'Zero','One','Two','Three'PS> $dataZero
motivul pentru Care folosim zero aici este că primul element este la început a listei, astfel încât avem de comandă al graduatorului offset de la 0 elemente pentru a ajunge la ea. Pentru a ajunge la al doilea element, va trebui să folosim o compensare de 1 toskip primul element.
PS> $dataOne
Acest lucru ar însemna că ultimul element este la offset 3.,
PS> $dataThree
Index
acum Puteți vedea de ce am ales valorile pe care le-am făcut pentru acest exemplu. Am introdus acest lucru ca un offsetpentru că este ceea ce este cu adevărat, dar acest offset este mai frecvent denumit index. Anindex care începe la 0
. Pentru restul acestui articol voi numi offset un index.
trucuri index speciale
în majoritatea limbilor, puteți specifica doar un singur număr ca index și veți obține un singur element înapoi.PowerShell este mult mai flexibil. Puteți utiliza mai mulți indici simultan., Prin furnizarea unei liste deindexuri, putem selecta mai multe elemente.
PS> $dataZeroTwoThree
elementele sunt returnate în funcție de ordinea indexurilor furnizate. Dacă duplicați un index, veți obține acel element de ambele ori.
PS> $dataThreeZeroThree
putem specifica o secvență de numere cu built-in ..
operator.
PS> $dataOneTwoThree
Acest lucru funcționează în sens invers prea.
PS> $dataThreeTwoOne
puteți utiliza valori negative ale indexului pentru a compensa de la sfârșit. Deci, dacă aveți nevoie de ultimul element din listă,puteți utiliza -1
.,
PS> $dataThree
în afara limitelor
în majoritatea limbilor, dacă încercați să accesați un index al unui element care a trecut de sfârșitul matricei, voiar primi un tip de eroare sau o excepție. PowerShell nu returnează nimic în tăcere.
PS> $null -eq $dataTrue
nu Pot index într-o matrice nulă
Dacă variabila este $null
și încercați să-l indice ca o matrice, veți obține unSystem.Management.Automation.RuntimeException
excepție cu mesajulCannot index into a null array
.,
PS> $empty = $nullSP> $emptyError: Cannot index into a null array.
Deci, asigurați-vă că matrice nu sunt $null
înainte de a încerca pentru a accesa elemente din interiorul ei.
Count
matrice și alte colecții au o proprietate count care vă spune cât de multe elemente sunt în matrice.
PS> $data.count4
PowerShell 3.0 a adăugat o proprietate count la majoritatea obiectelor. puteți avea un singur obiect și se shouldgive un număr de 1
.
PS> $date = Get-DatePS> $date.count1
Și $null
are un număr de proprietate, cu excepția de a se întoarce 0
.,
PS> $null.count0
Există unele capcane aici că voi revedea când am acoperi de verificare pentru $null
sau gol arrayslater în acest articol.
Off-by-one erori
o eroare de programare comună este creată deoarece matrice începe la index 0. Erorile Off-by-one pot fiintroduse în două moduri.primul este de gândire mental doriți al doilea element și folosind un index de 2
și într-adevăr gettingthe treilea element. Sau gândindu-vă că aveți patru elemente și doriți ultimul element, astfel încât să utilizați numărapentru a accesa ultimul element.,
$data
PowerShell este perfect fericit să te las să faci asta și să-ți dau exact ce element există în index 4:$null
. Ar trebui să utilizați $data.count - 1
sau -1
despre care am aflat mai sus.
PS> $dataThree
aici puteți utiliza indexul -1
pentru a obține ultimul element.
PS> $dataThree
Lee Dailey, de asemenea, mi-a arătat că putem folosi $data.GetUpperBound(0)
pentru a obține max indexnumber.,
PS> $data.GetUpperBound(0)3PS> $dataThree
al doilea mod cel mai frecvent este atunci când iterați lista și nu vă opriți la momentul potrivit. I ‘ llrevizit acest lucru atunci când vorbim despre utilizareafor
buclă.
actualizarea elementelor
putem folosi același index pentru a actualiza elementele existente în matrice. Acest lucru ne oferă acces direct lapdați articole individuale.
$data = 'dos'$data = 'tres'
dacă încercăm să actualizăm un element care a trecut de ultimul element, atunci obținem o eroareIndex was outside the bounds of the array.
.
voi revedea acest lucru mai târziu când voi vorbi despre cum să faceți o matrice mai mare.,
iterație
la un moment dat, poate fi necesar să parcurgeți sau să iterați întreaga listă și să efectuați o acțiune pentru fiecare element din matrice.
conducte
matrice și conducta PowerShell sunt destinate pentru fiecare alte. Aceasta este una dintre cele mai simple căi de aproces peste aceste valori. Când treceți o matrice într-o conductă, fiecare element din interiorul matricei esteprelucrate individual.
PS> $data = 'Zero','One','Two','Three'PS> $data | ForEach-Object {"Item: "}Item: Item: Item: Item:
Dacă nu ați văzut $PSItem
înainte, știu doar că e același lucru ca $_
., Puteți utiliza oriceunul deoarece ambele reprezintă obiectul curent din conductă.
bucla ForEach
ForEach
bucla funcționează bine cu colecții. Folosind sintaxa:foreach ( <variable> in <collection> )
foreach ( $node in $data ){ "Item: "}
metoda ForEach
am tendința de a uita despre asta dar funcționează bine pentru operații simple. PowerShell vă permite tocall .ForEach()
pe o colecție.
PS> $data.foreach({"Item "})Item Item Item Item
.foreach()
ia un parametru care este un bloc de script., Puteți renunța la paranteze și doarasigurați blocul de script.
$data.foreach{"Item "}
aceasta este o sintaxă mai puțin cunoscută, dar funcționează la fel. Această metodă foreach
a fost adăugată înpowershell 4.0.
pentru buclă
for
bucla este folosită foarte mult în majoritatea celorlalte limbi, dar nu o vedeți prea mult în PowerShell. Când o vezi, este adesea în contextul mersului pe jos o matrice.
for ( $index = 0; $index -lt $data.count; $index++){ "Item: " -f $data}
primul lucru pe care îl facem este de a inițializa un $index
și 0
., Apoi adăugăm condiția ca $index
să fie mai mică decât $data.count
. În cele din urmă, specificăm că de fiecare dată când buclăm că trebuie să mărimindex cu 1
. În acest caz $index++
este prescurtarea de la $index = $index + 1
.
ori de câte ori utilizați o buclă for
, acordați o atenție deosebită condiției. Am folosit$index -lt $data.count
aici. Este ușor pentru a obține condiția ușor greșit pentru a obține un off-by-oneerror în logica ta., Folosind $index -le $data.count
sau $index -lt ($data.count - 1)
sunt vreodată soslightly greșit. Acest lucru ar determina rezultatul dvs. să proceseze prea multe sau prea puține elemente. Aceasta este eroarea clasică off-by-one.
bucla de comutare
aceasta este una ușor de trecut cu vederea. Dacă furnizați o matrice la o instrucțiune switch, itcheck fiecare element din matrice.
$data = 'Zero','One','Two','Three'switch( $data ){ 'One' { 'Tock' } 'Three' { 'Tock' } Default { 'Tick' }}
TickTockTickTock
Există o mulțime de lucruri interesante pe care le putem face cu switch. Am un alt articoldedicat acestui lucru.,
- Tot ce ai dorit vreodată să știți despre switch
Actualizarea valorilor
atunci Când matrice este o colecție de șir de caractere sau numere întregi (tipuri de valoare), uneori, poate doriți toupdate valorile din matrice ca ai buclă peste ele. Majoritatea buclelor de mai sus utilizează o variabilă înbuclă care deține o copie a valorii. Dacă actualizați acea variabilă, valoarea inițială din matrice estenu este actualizată.
excepția de la această declarație estefor
buclă., Dacă vrei să mergi de-o matrice și actualizarea valuesinside, atunci for
bucla este ceea ce căutați pentru.
for ( $index = 0; $index -lt $data.count; $index++ ){ $data = "Item: " -f $data}
Acest exemplu are o valoare de index, face câteva modificări, și apoi folosește același index pentru a assignit înapoi.până în prezent, singurul lucru pe care l-am plasat într-o matrice este un tip de valoare, dar Matricele pot conține șiobiecte.
$data = @( @{FirstName='Kevin';LastName='Marquette'} @{FirstName='John'; LastName='Doe'})
multe cmdleturi returnează colecții de obiecte ca matrice atunci când le atribuiți unei variabile.,
$processList = Get-Process
Toate caracteristicile de bază am vorbit deja despre încă se aplică matrice de obiecte cu o fewdetails merită subliniat.
accesarea proprietăților
putem folosi un index pentru a accesa un element individual dintr-o colecție la fel ca în cazul tipurilor de valori.
PS> $dataFirstName LastName----- ----Kevin Marquette
putem accesa și actualiza proprietățile direct.,
PS> $data.FirstNameKevinPS> $data.FirstName = 'Jay'PS> $dataFirstName LastName----- ----Jay Marquette
Array proprietăți
în mod Normal, ar trebui sa insir toata lista ca acest lucru pentru a accesa toate proprietățile:
PS> $data | ForEach-Object {$_.LastName}MarquetteDoe
cu ajutorul Select-Object -ExpandProperty
cmdlet.
PS> $data | Select-Object -ExpandProperty LastNameMarquetteDoe
Dar PowerShell ne oferă posibilitatea de a solicita LastName
direct. PowerShell enumeră themall pentru noi și returnează o listă curată.
PS> $data.LastNameMarquetteDoe
enumerarea încă se întâmplă, dar nu vedem complexitatea din spatele ei.,
Where-Object filtering
acesta este locul în care Where-Object
vine astfel încât să putem filtra și selecta ceea ce dorim din matricebazat pe proprietățile obiectului.
PS> $data | Where-Object {$_.FirstName -eq 'Kevin'}FirstName LastName----- ----Kevin Marquette
putem scrie aceeași interogare pentru a obține FirstName
pe care o căutăm.
$data | Where FirstName -eq Kevin
, Unde()
Tablouri au un Where()
metoda pe ele, care vă permite să specificați un scriptblock
pentru filtru.
$data.Where({$_.FirstName -eq 'Kevin'})
această caracteristică a fost adăugată în PowerShell 4.0.,
actualizarea obiectelor în bucle
cu tipuri de valori, singura modalitate de a actualiza matricea este să folosim o buclă for, deoarece trebuie să știemindex pentru a înlocui valoarea. Avem mai multe opțiuni cu obiecte, deoarece sunt tipuri de referință. Aici este un exemplu rapid:
foreach($person in $data){ $person.FirstName = 'Kevin'}
Această buclă este de mers pe jos în fiecare obiect în $data
matrice. Deoarece obiectele sunt tipuri de referință, variabila$person
face referire la exact același obiect care este în matrice. Deci, actualizări la itsproperties actualiza originalul.,încă nu puteți înlocui întregul obiect în acest fel. Dacă încercați să atribuiți un obiect nou variabilei$person
, actualizați referința variabilei la altceva care nu mai indică obiectul original din matrice. Acest lucru nu funcționează așa cum v-ați aștepta:
foreach($person in $data){ $person = @{ FirstName='Kevin' LastName='Marquette' }}
operatori
operatorii din PowerShell lucrează și pe matrice. Unele dintre ele funcționează puțin diferit.
-Alăturați-vă
-join
operatorul este cel mai evident, așa că să ne uităm mai întâi la el., Îmi place operatorul -join
și îl folosesc des. Se alătură tuturor elementelor din matrice cu caracterul sau șirulspecificați.
PS> $data = @(1,2,3,4)PS> $data -join '-'1-2-3-4PS> $data -join ','1,2,3,4
Una dintre caracteristicile care-mi place despre -join
operatorul care se ocupă de elemente unice.
PS> 1 -join '-'1
eu folosesc acest lucru în interiorul logare și mesaje verbose.
PS> $data = @(1,2,3,4)PS> "Data is $($data -join ',')."Data is 1,2,3,4.
-Alăturați-vă $array
Iată un truc inteligent pe care Lee Dailey mi l-a subliniat., Dacă vrei vreodată să se alăture everythingwithout un delimitator, în loc de a face acest lucru:
PS> $data = @(1,2,3,4)PS> $data -join $null1234
puteți folosi -join
cu matrice ca parametru fără prefix. Uitați-vă la acest exemplu pentrua se vedea că vorbesc despre.
PS> $data = @(1,2,3,4)PS> -join $data1234
-înlocuiți și -split
alte operatorii, cum ar fi -replace
și -split
executa pe fiecare element din matrice. Nu pot spune că le-am folosit vreodată în acest fel, dar aici este un exemplu.,
PS> $data = @('ATX-SQL-01','ATX-SQL-02','ATX-SQL-03')PS> $data -replace 'ATX','LAX'LAX-SQL-01LAX-SQL-02LAX-SQL-03
-conține
-contains
operator vă permite să verificați o serie de valori pentru a vedea dacă acesta conține o durata specificată.
PS> $data = @('red','green','blue')PS> $data -contains 'green'True
în
atunci Când aveți o singură valoare care le-ar dori pentru a verifica dacă se potrivește cu una din mai multe valori, utilizați -in
operator. Valoarea ar fi în partea stângă și matricea din partea dreaptăoperator.
PS> $data = @('red','green','blue')PS> 'green' -in $dataTrue
Acest lucru poate deveni scump dacă lista este mare. Folosesc adesea un model regex dacă verific mai mult decâtcâteva valori.,
PS> $data = @('red','green','blue')PS> $pattern = "^({0})$" -f ($data -join '|')PS> $pattern^(red|green|blue)$PS> 'green' -match $patternTrue
-eq și-ne
egalitatea și matricele se pot complica. Când matricea este în partea stângă, fiecare element devineîn comparație. În loc să returneze True
, returnează obiectul care se potrivește.
PS> $data = @('red','green','blue')PS> $data -eq 'green'green
când utilizați operatorul-ne
, obținem toate valorile care nu sunt egale cu valoarea noastră.
PS> $data = @('red','green','blue')PS> $data -ne 'green'redblue
atunci Când utilizați acest lucru într-un if()
declarație, valoarea returnată este un True
valoare., Dacă nu este returnată nicio valoare, atunci este o valoare False
. Ambele declarații următoare evaluează la True
.
$data = @('red','green','blue')if ( $data -eq 'green' ){ 'Green was found'}if ( $data -ne 'green' ){ 'And green was not found'}
voi revedea aceasta într-un moment când vorbim despre testarea pentru $null
.
-meci
-match
operatorul încearcă să se potrivească fiecare element din colecție.
PS> $servers = @( 'LAX-SQL-01' 'LAX-API-01' 'ATX-SQL-01' 'ATX-API-01')PS> $servers -match 'SQL'LAX-SQL-01ATX-SQL-01
atunci Când utilizați -match
cu o singură valoare, o variabilă special $Matches
va fi completat cu matchinfo., Acesta nu este cazul când o matrice este procesată în acest fel.
putem lua aceeași abordare cu Select-String
.
$servers | Select-String SQL
am să ia o privire mai atentă la Select-String
,-match
și $matches
variabilă într-un alt post denumită multe moduri de a folosi regex.
$null sau gol
testarea pentru $null
sau matrice goale poate fi dificil. Iată capcanele comune cu matrice.
pe scurt, această afirmație pare că ar trebui să funcționeze.,
if ( $array -eq $null){ 'Array is $null'}
Dar am trecut peste cum -eq
verifică fiecare element din matrice. Deci putem avea o serie de severalitems cu un singur $valoare nulă și se va evalua la $true
$array = @('one',$null,'three')if ( $array -eq $null){ 'I think Array is $null, but I would be wrong'}
acesta este de ce este o bună practică pentru a plasa $null
pe partea stângă a operatorului. Acest lucru face ca acest scenariu să nu fie o problemă.
if ( $null -eq $array ){ 'Array actually is $null'}
$null
array nu este același lucru ca un array gol. Dacă știți că aveți o matrice, verificațicontul de obiecte din ea., Dacă matricea este $null
, numărul este 0
.
if ( $array.count -gt 0 ){ "Array isn't empty"}
există încă o capcană de care trebuie să aveți grijă aici. Puteți folosi count
chiar dacă aveți un singleobject, cu excepția cazului în care obiectul este un PSCustomObject
. Acesta este un bug care este fixat în PowerShell 6.1.Aceasta este o veste bună, dar mulți oameni sunt încă pe 5.1 și trebuie să fie atenți la asta.
PS> $object = @{Name='TestObject'}PS> $object.count$null
Dacă ești încă pe PowerShell 5.1, puteți încheia obiect într-o matrice înainte de a verifica conta obține un număr exact.,
if ( @($array).count -gt 0 ){ "Array isn't empty"}
pentru a juca pe deplin în condiții de siguranță, verificați pentru $null
, apoi verificați numărul.
if ( $null -ne $array -and @($array).count -gt 0 ){ "Array isn't empty"}
All-eq
am văzut recent pe cineva întrebând Cum să verifice dacă fiecare valoare dintr-o matrice se potrivește cu o anumită valoare.Reddit user / u / bis a avut această soluție inteligentă care verifică orice valori incorecte și thenflips rezultatul.
$results = Test-Somethingif ( -not ( $results -ne 'Passed') ){ 'All results a Passed'}
adăugarea la matrice
În acest moment, începeți să vă întrebați cum să adăugați elemente într-o matrice. Răspunsul rapid este că nu puteți. o matrice este o dimensiune fixă în memorie., Dacă trebuie să-l crești sau să adaugi un singur element, atuncitrebuie să creați o nouă matrice și să copiați toate valorile din vechea matrice. Acest lucru sună ca o mulțime de muncă, cu toate acestea, PowerShell ascunde complexitatea creării noului tablou. Powershellimplementează operatorul de adăugare (+
) pentru matrice.
notă
PowerShell nu implementează o operație de scădere. Dacă doriți o alternativă flexibilă la anarray, trebuie să utilizați un obiect generic List
.,
Adăugare matrice
putem folosi operatorul de adăugare cu matrice pentru a crea o nouă matrice. Deci, având în vedere aceste două matrice:
$first = @( 'Zero' 'One')$second = @( 'Two' 'Three')
le putem adăuga împreună pentru a obține o nouă matrice.
PS> $first + $secondZeroOneTwoThree
Plus este egal cu +=
putem crea o nouă matrice în loc și de a adăuga un element la o astfel de prognoze:
$data = @( 'Zero' 'One' 'Two' 'Three')$data += 'four'
Doar amintiți-vă că de fiecare dată când utilizați +=
că ești duplicarea și crearea unei noi matrice. Thisis o nu o problemă pentru seturi de date mici, dar scalează extrem de slab.,
alocarea conductelor
puteți atribui rezultatele oricărei conducte într-o variabilă. Este o matrice dacă conține multipleitems.
$array = 1..5 | ForEach-Object { "ATX-SQL-$PSItem"}
în mod normal, atunci când ne gândim la utilizarea conductei, ne gândim la garniturile tipice PowerShell. Canleverage conducta cuforeach()
declarații și alte bucle. Deci, în loc de a adăuga elemente la anarray într-o buclă, putem picătură elemente pe conducta.
$array = foreach ( $node in (1..5)){ "ATX-SQL-$node"}
Array Tipuri
în mod implicit, o serie în PowerShell este creat ca un ]
tip., Acest lucru îi permite să conținăorice tip de obiect sau valoare. Acest lucru funcționează deoarece totul este moștenit de la PSObject
tip.
matrice puternic tastate
puteți crea o matrice de orice tip folosind o sintaxă similară. Când creați un tablou puternic tastat, acesta poate conține numai valori sau obiecte de tipul specificat.
ArrayList
adăugarea de elemente într-o matrice este una dintre cele mai mari limitări, dar există și alte câteva colecțiipe care le putem apela pentru a rezolva această problemă.,
ArrayList
este de obicei unul dintre primele lucruri la care ne gândim când avem nevoie de o matrice cu care să lucrăm mai repede. Se comportă ca o matrice obiect fiecare loc pe care avem nevoie de ea, dar se ocupă de addingitems rapid.
Iată cum creăm unArrayList
și adăugăm elemente la acesta.
$myarray = ::new()$myArray.Add('Value')
apelăm la.net pentru a obține acest tip. În acest caz, folosim constructorul implicit pentrucreați-l. Apoi apelăm metoda Add
pentru a adăuga un element la acesta.,
motivul pentru care folosesc la începutul liniei este de a suprima codul de retur. Some.NET apelurile fac acest lucru și pot crea o ieșire neașteptată.dacă singurele date pe care le aveți în matrice sunt șiruri de caractere, atunci aruncați o privire și la utilizareastringbuilder. Este aproape același lucru, dar are unele metode care sunt doar pentru a face față custrings.
StringBuilder
este special conceput pentru performanță.
este comun pentru a vedea oamenii muta la ArrayList
din matrice. Dar vine dintr-un moment în care C# nu a avut suport generic., ArrayList
este depreciată în suport pentru generic List
Listă Generică
Un tip generic este un tip special în C# care definește un generalizate clasă și utilizatorul specifică datele tipuri se folosește atunci când l-a creat. Deci, dacă doriți o listă de numere sau siruri de caractere, ar definethat vrei lista de int
sau string
tipuri.
Iată cum creați o listă pentru șiruri de caractere.
$mylist = ]::new()
sau o listă pentru numere.,
$mylist = ]::new()
putem arunca o serie existent la un astfel de listă fără a crea primul obiect:
$mylist = ]@(1,2,3)
putem scurta sintaxa cu using namespace
declarație în PowerShell 5 și mai noi. Declarațiausing
trebuie să fie prima linie a scriptului. Prin declararea unui spațiu de nume, PowerShelllets îl lăsați în afara tipurilor de date atunci când le referiți.
using namespace System.Collections.Generic$myList = ]@(1,2,3)
Acest lucru face ca List
mult mai utilizabil.,
aveți la dispoziție o metodă similară Add
. Spre deosebire de ArrayList, nu există nici o valoare întoarcere pe Add
metoda deci nu trebuie să void
ea.
$myList.Add(10)
și putem accesa în continuare elementele ca alte matrice.
PS> $myList10
Lista
puteți avea o listă de orice tip, dar atunci când nu știi la tipul de obiecte, puteți folosi]
să le conțină.,
$list = ]::new()
Remove()
ArrayList
si generic List
ambele sprijin eliminarea de elemente din colecție.
using namespace System.Collections.Generic$myList = ]@('Zero','One','Two','Three')$myList.Remove("Two")ZeroOneThree
când lucrați cu tipuri de valori, îl elimină pe primul din listă. Puteți să o apelați din nou și din nou pentru a continua să eliminați această valoare. Dacă aveți tipuri de referință, trebuie să furnizați obiectulpe care doriți să le eliminați.,
]$drives = Get-PSDrive$drives.remove($drives)
$delete = $drives$drives.remove($delete)
elimina metoda returneaza true
dacă a fost capabil de a găsi și elimina element din colecție.
mai multe colecții
există multe alte colecții care pot fi utilizate, dar acestea sunt înlocuirile bune de matrice generice.Dacă sunteți interesat să aflați mai multe dintre aceste opțiuni, aruncați o privire la acest lucrugist thatMark Kraus pus împreună.
alte nuanțe
acum că am acoperit toate funcționalitățile majore, iată câteva lucruri pe care am vrut să le menționez înainte de a încheia acest lucru.,
matricele pre-dimensionate
am menționat că nu puteți modifica dimensiunea unei matrice odată ce a fost creată. Putem crea o matrice deo dimensiune predeterminată apelând-o cu constructorul new($size)
.
$data = ]::new(4)$data.count4
Multiplicare matrice
Un mic truc interesant este că puteți înmulți o matrice cu un număr întreg.
PS> $data = @('red','green','blue')PS> $data * 3redgreenblueredgreenblueredgreenblue
inițializați cu 0
un scenariu comun este că doriți să creați o matrice cu toate zerourile. Dacă veți avea doarintegers, o matrice puternic tastată de numere întregi este implicită la toate zerourile.,
PS> ]::new(4)0000
putem folosi trucul de multiplicare pentru a face acest lucru.
PS> $data = @(0) * 4PS> $data0000
lucrul frumos despre trucul de multiplicare este că puteți utiliza orice valoare. Deci, dacă ar fi mai degrabăaveți 255
ca valoare implicită, aceasta ar fi o modalitate bună de a face acest lucru.
PS> $data = @(255) * 4PS> $data255255255255
matricele imbricate
o matrice din interiorul unei matrice se numește matrice imbricată. Nu le folosesc mult în PowerShell, dar le-am folosit mai mult în alte limbi. Luați în considerare utilizarea unei matrice de matrice atunci când datele se încadrează într-un model gridlike.,iată două moduri în care putem crea o matrice bidimensională.
$data = @(@(1,2,3),@(4,5,6),@(7,8,9))$data2 = @( @(1,2,3), @(4,5,6), @(7,8,9))
virgula este foarte importantă în aceste exemple. Am dat un exemplu anterior de matrice normalămai multe linii în care virgula era opțională. Nu este cazul cu o matrice multidimensională.
modul în care folosim notația indexului se schimbă ușor acum că avem o matrice imbricată. Folosind$data
de mai sus, așa vom accesa valoarea 3.
PS> $outside = 0PS> $inside = 2PS> $data3
adăugați un set de paranteze pentru fiecare nivel de matrice cuiburi., Primul set de paranteze este pentru matricea cea mai exterioară și apoi lucrați de acolo.
Write-Output-NoEnumerate
PowerShell îi place să desfacă sau să enumere matrice. Acesta este un aspect de bază al modului în care PowerShell utilizeazăpipeline, dar există momente în care nu doriți să se întâmple asta.
i frecvent obiecte țeavă la Get-Member
pentru a afla mai multe despre ele. Când am țeavă o matrice la ea, itgets unwrapped și Get-membru vede membrii matrice și nu matrice reală.,
PS> $data = @('red','green','blue')PS> $data | Get-MemberTypeName: System.String...
pentru a preveni desfacerea matricei, puteți utiliza Write-Object -NoEnumerate
.
PS> Write-Output -NoEnumerate $data | Get-MemberTypeName: System.Object...
am un al doilea mod care este mai mult un hack (și încerc să evit hack-urile de genul acesta). Puteți plasa acomma în fața matrice înainte de țeavă.
PS> ,$data | Get-MemberTypeName: System.Object...
returnați o matrice
această despachetare a matricelor se întâmplă și atunci când ieșiți sau returnați valori dintr-o funcție. Puteți obține încă o matrice dacă atribuiți ieșirea unei variabile, astfel încât aceasta nu este de obicei o problemă.captura este că aveți o nouă matrice., Dacă aceasta este vreodată o problemă, puteți utilizaWrite-Output -NoEnumerate $array
sau return ,$array
pentru a rezolva problema.
Lasă un răspuns