matricele sunt o caracteristică fundamentală a limbajului majorității limbajelor de programare. Ele sunt o colecție de valori sau obiecte și, prin urmare, sunt greu de evitat. Să aruncăm o privire atentă la matrice și tot ce au de oferit.

  • indexul paginii
  • ce este o matrice?,meci
  • $nul sau gol
    • Toate -eq
  • Adăugarea la tablouri
    • Array plus
    • Plus este egal cu +=
    • Conducte misiune
  • Array Tipuri
    • Puternic tastat matrice
    • ArrayList
    • Listă Generică
      • Lista
      • Remove()
    • Mai multe colecții
  • Alte nuanțe
    • Pre-dimensiuni matrice
    • Multiplicare matrice
    • Inițializa cu 0
    • tablouri Imbricate
    • Scrie-Ieșire -NoEnumerate
      • Returneze un array
  • Orice altceva?,
  • 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 cele 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 matrice sau accesa elemente individuale folosind un index. Matricea este creată ca o bucată secvențială de memorie î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 a lucra cu ele în PowerShell.

    de a Crea o matrice cu @()

    Un array gol poate fi creat prin utilizarea @()

     PS> $data = @() PS> $data.count 0

    putem crea o matrice și semințe cu valori doar prin plasarea lor în @() paranteze.

     PS> $data = @('Zero','One','Two','Three') PS> $data.count 4 PS> $data Zero One Two Three

    această matrice are 4 elemente. Când apelăm variabila $data, vedem lista articolelor noastre., Dacă este o serie de șiruri, atunci vom avea o linie pe șir.

    putem declara o matrice pe mai multe linii. Virgula este opțională în acest caz și, în general, lăsată afară.

     $data = @( 'Zero' 'One' 'Two' 'Three' )

    prefer să declar matricele mele pe mai multe linii de genul acesta. Nu numai că este mai ușor de citit atunci când aveți mai multe elemente, ci și mai ușor de comparat cu versiunile anterioare atunci când utilizați controlul sursei.,

    altă sintaxă

    se înțelege de obicei că @() este sintaxa pentru crearea unui tablou, dar listele separate prin virgulă funcționează de 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 siruri de caractere la 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 acceptă șiruri., 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 elemente individuale, folosim parantezele cu o valoare offset începând de la 0. Acest lucru este cum vom ajunge primul element din matrice noastre:

     PS> $data = 'Zero','One','Two','Three' PS> $data Zero

    motivul pentru Care folosim zero aici este că primul element la începutul listei, deci vom folosi un offset de 0 elemente pentru a ajunge la ea., Pentru a ajunge la al doilea element, va trebui să folosim o compensare de 1 pentru a sări peste primul element.

     PS> $data One

    acest lucru ar însemna că ultimul element este la offset 3.

     PS> $data Three

    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 offset, deoarece că este ceea ce este cu adevărat, dar acest offset este mai frecvent menționată ca un index. Un index care începe la 0. Pentru restul acestui articol voi numi offset un index.,

    trucuri speciale pentru index

    în majoritatea limbilor, puteți specifica doar un singur număr ca index și veți primi un singur element înapoi. PowerShell este mult mai flexibil. Puteți utiliza mai mulți indici simultan. Prin furnizarea unei liste de indexuri, putem selecta mai multe elemente.

     PS> $data Zero Two Three

    elementele vor fi returnate în funcție de ordinea indexurilor furnizate. Dacă duplicați un index, veți primi acel element de ambele ori.,

     PS> $data Three Zero Three

    putem specifica o secvență de numere cu construit în .. operator.

     PS> $data One Two Three

    Acest lucru funcționează în sens invers prea.

     PS> $data Three Two One

    puteți utiliza valorile indexului negitiv pentru a compensa de la sfârșit. Deci, dacă aveți nevoie de ultimul element din listă, puteți utiliza -1.,

     PS> $data Three

    în afara limitelor

    în majoritatea limbilor, dacă încercați să accesați un index al unui element care este trecut de sfârșitul matricei, veți obține un tip de eroare sau o excepție. PowerShell nu vă va oferi nimic în tăcere.

     PS> $null -eq $data True

    nu Pot index într-o matrice nulă

    Dacă variabila este $null și încercați să-l indice ca o matrice, vei primi un System.Management.Automation.RuntimeException excepție cu mesajul Cannot index into a null array.,

     PS> $empty = $null SP> $empty Error: 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.count 4

    PowerShell 3.0 a adăugat o proprietate count la majoritatea obiectelor. puteți avea un singur obiect și ar trebui să vă dea un număr de 1.,

     PS> $date = Get-Date PS> $date.count 1

    Și $null are un număr de proprietate, cu excepția de a se întoarce 0.

     PS> $null.count 0

    Există unele capcane aici că voi revedea când am acoperi de verificare pentru $null sau gol tablouri mai târziu în acest articol.

    oprit de o eroare

    o eroare de programare comună este creată deoarece matricele încep de la indexul 0. Un off de o eroare pot fi introduse în două moduri foarte frecvente.,

    primul este de gândire mental pe care doriți elementul 2 și folosind un index de 2 și într-adevăr obținerea al treilea element. Sau gândindu-vă că aveți 4 articole și doriți ultimul articol, așa că veți folosi doar dimensiunea pentru a accesa ultimul articol.

     $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 - 1sau -1 despre care am aflat mai sus.,

     PS> $data Three

    aici puteți utiliza indexul -1 pentru a obține ultimul element.

     PS> $data Three

    Lee Dailey, de asemenea, mi-a arătat că putem folosi $data.GetUpperBound(0) pentru a obține max numărul de index.

     PS> $data.GetUpperBound(0) Three

    al doilea mod cel mai frecvent este atunci când iterați lista și nu vă opriți la momentul potrivit. Voi revizui acest lucru atunci când vorbim despre utilizarea for buclă.,

    actualizarea elementelor

    putem folosi același index pentru a actualiza elementele existente în matrice. Acest lucru ne oferă acces direct la actualizarea elementelor individuale.

     $data = 'dos' $data = 'tres'

    Dacă am încerca să actualizeze un element care este ultimul element, atunci vom obține un Index was outside the bounds of the array. eroare.

    voi revedea acest lucru mai târziu când voi vorbi despre cum să faceți o matrice mai mare.la un moment dat, va trebui 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 moduri de a procesa peste aceste valori. Când treceți o matrice la o conductă, fiecare element din interiorul matricei este procesat 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ă același lucru ca $_. Puteți utiliza fie unul, deoarece ambele reprezintă obiectul curent în conducta.,

    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 să apelați .ForEach() pe o colecție.

     PS> $data.foreach({"Item "}) Item Item Item Item 

    .foreach() este nevoie de un parametru care este un bloc de script. Puteți renunța la paranteze și să furnizați doar 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ă în PowerShell 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 vedeți, este adesea în contextul mersului pe jos.

     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 $indexsă 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ăresc indicele 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 foarte ușor pentru a obține condiția ușor greșit pentru a obține un off de o eroare în logica ta., Folosind $index -le $data.count sau $index -lt ($data.count - 1) sunt vreodată atât de ușor greșit. Acest lucru ar determina rezultatul dvs. să proceseze prea multe sau prea puține elemente. Acesta este clasicul oprit de o singură eroare.

    bucla de comutare

    aceasta este una care este foarte ușor de trecut cu vederea. Dacă furnizați o matrice la o instrucțiune comutator, se va potrivi pe fiecare element din matrice.

     $data = 'Zero','One','Two','Three' switch( $data ) { 'One' { 'Tock' } 'Three' { 'Tock' } Default { 'Tick' } }

    Acest lucru va produce această ieșire:

     Tick Tock Tick Tock

    Există o mulțime de lucruri interesante, ca aceasta pe care o putem face cu switch., Am un alt articol dedicat 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, veți dori pentru a actualiza valorile din matrice ca ai buclă peste ele. Majoritatea buclelor de mai sus folosesc o variabilă în buclă care deține o copie a valorii. Dacă actualizați acea variabilă, valoarea inițială din matrice nu este actualizată.

    excepția de la această afirmație estefor buclă., Dacă doriți să parcurgeți o matrice și să actualizați valorile în interiorul acesteia, atunci bucla for este ceea ce căutați.

     for ( $index = 0; $index -lt $data.count; $index++ ) { $data = "Item: " -f $data }

    Această exemple are o valoare de index, face câteva modificări, și apoi folosește același index pentru a atribui î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 și obiecte.

     $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 câteva detalii în valoare de subliniind.

    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> $data FirstName LastName ----- ---- Kevin Marquette

    putem accesa și actualiza proprietățile direct.,

     PS> $data.FirstName Kevin PS> $data.FirstName = 'Jay' PS> $data FirstName 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} Marquette Doe

    cu ajutorul Select-Object -ExpandProperty cmdlet.

     PS> $data | Select-Object -ExpandProperty LastName Marquette Doe

    Dar PowerShell ne oferă posibilitatea de a solicita LastName direct. PowerShell le va enumera pe toate pentru noi și ne va oferi o listă curată.,

     PS> $data.LastName Marquette Doe

    enumerarea încă se întâmplă, dar nu vedem complexitatea din spatele ei.

    Where-Object filtering

    acesta este locul unde Where-Object vine astfel încât să putem filtra și selecta ceea ce dorim din matrice pe baza proprietăților obiectului.

     PS> $data | Where-Object {$_.FirstName -eq 'Kevin'} FirstName LastName ----- ---- Kevin Marquette

    putem scrie că aceeași interogare ca aceasta pentru a obține FirstName suntem în căutarea pentru.,

     $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ă pentru că trebuie să cunoaștem indexul 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ările proprietăților sale vor 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 variabilă la altceva care nu mai indică obiectul original din matrice., Acest lucru nu va funcționa 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.

    -join

    operatorul -join este cel mai evident, așa că ne vom uita la el mai întâi. Îmi place operatorul -join și îl folosesc des. Acesta va alătura toate elementele din matrice cu un caracter sau șir pe care îl specificați.,

     PS> $data = @(1,2,3,4) PS> $data -join '-' 1-2-3-4 PS> $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 totul fără un delimitator, în loc de a face acest lucru:

     PS> $data = @(1,2,3,4) PS> $data -join $null 1234

    puteți folosi -join cu matrice ca parametru fără prefix. Uitați-vă la acest exemplu pentru a vedea despre ce vorbesc.

     PS> $data = @(1,2,3,4) PS> -join $data 1234

    -înlocuiți și -split

    alte operatorii, cum ar fi -replace și -split va executa pe fiecare element din matrice. Nu pot spune că le-am folosit vreodată în acest fel, dar iată un exemplu.,

     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

    -conține

    -contains operator vă va permite să verificați o serie de valori pentru a vedea dacă acesta conține o valoare 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, puteți folosi -in operator. Valoarea ar fi pe partea stângă și matrice pe partea dreaptă a operațiunii.,

     PS> $data = @('red','green','blue') PS> 'green' -in $data True

    Acest lucru poate deveni scump dacă lista este mare. Voi folosi adesea un model regex dacă verific mai mult de 4-5 valori.

     PS> $data = @('red','green','blue') PS> $pattern = "^({0})$" -f ($data -join '|') PS> $pattern ^(red|green|blue)$ PS> 'green' -match $pattern True

    -eq și-ne

    egalitatea și matricele se pot complica. Când matricea este pe partea stângă, fiecare element va fi comparat. În loc să returneze True, acesta va returna obiectul care se potrivește.,

     PS> $data = @('red','green','blue') PS> $data -eq 'green' green

    atunci Când utilizați -ne operator, vom lua toate valorile care nu sunt egale cu valoarea noastră.

     PS> $data = @('red','green','blue') PS> $data -ne 'green' red blue

    atunci Când utilizați acest lucru într-un if() declarație, valoarea returnată este un True valoare. Dacă nu se returnează nicio valoare, atunci este o valoare False. Ambele declarații următoare vor evalua 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 va încerca 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-01 ATX-SQL-01

    atunci Când utilizați -match cu o singură valoare, o variabilă special $Matches va fi completat cu informatii meci. Acest lucru nu este cazul atunci 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 numit de multe moduri de a folosi regex.

    $null sau empty

    testarea pentru$null sau matricele goale pot fi dificile. 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 mai multe articole 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ți numărul de obiecte din ea., Dacă matricea este $null, numărul va fi 0.

     if ( $array.count -gt 0 ) { 'Array is not empty' }

    există încă o capcană de care să aveți grijă aici. Puteți folosi count chiar dacă aveți un singur obiect, 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ă sunteți încă pe PowerShell 5.,1, puteți înfășura obiectul într-o matrice înainte de a verifica numărul pentru a obține un număr precis.

     if ( @($array).count -gt 0 ) { 'Array is not empty' }

    pe deplin Să-l joace în condiții de siguranță, verificați pentru $null, apoi verifica numărul.

     if ( $null -ne $array -and @($array).count -gt 0 ) { 'Array is not 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ă dacă există valori incorecte și apoi răstoarnă rezultatul.,

     $results = Test-Something if ( -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ă o creșteți sau să adăugați un singur element, atunci trebuie să creați o nouă matrice și să copiați toate valorile din vechea matrice. Acest lucru sună scump și ca o mulțime de muncă, cu toate acestea, PowerShell ascunde complexitatea creării noului tablou.

    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 + $second Zero One Two Three

    Plus este egal cu +=

    putem crea o nouă matrice în loc și se adaugă un element pentru a-l astfel:

     $data = @( 'Zero' 'One' 'Two' 'Three' ) $data += 'four'

    Doar amintiți-vă că de fiecare dată când utilizați += că sunteți web duplicarea și crearea unei noi matrice. Aceasta nu este o problemă pentru seturi de date mici, dar scalează extrem de slab.,

    alocarea conductelor

    puteți atribui rezultatele oricărei conducte într-o variabilă. Va fi o matrice dacă conține mai multe elemente.

     $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. Putem folosi conducta cuforeach() declarații și alte bucle. Deci, în loc să adăugăm elemente într-o matrice într-o buclă, putem arunca elemente pe conductă.,

     $array = foreach ( $node in (1..5)) { "ATX-SQL-$node" }

    atribuind rezultateleforeach unei variabile, capturăm toate obiectele și creăm o singură matrice.

    tipuri de matrice

    în mod implicit, o matrice î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 articole într-o matrice este una dintre cele mai mari limitări ale sale, dar există și alte câteva colecții la care 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 rapid. Acționează ca o matrice de obiecte în fiecare loc de care avem nevoie, dar se ocupă de adăugarea rapidă a articolelor.

    Iată cum creăm un ArrayList și adăugăm elemente la acesta.,

     $myarray = ::new() $myArray.Add('Value')

    solicităm în .Net pentru a obține acest tip. În acest caz, folosim constructorul implicit pentru a-l crea. 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. Unele apeluri. net vor face 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 utilizarea StringBuilder., Este aproape același lucru, dar are unele metode care sunt doar pentru a face față șirurilor. StringBuilder este special conceput pentru performanță.

    • corzi Concatenate folosind StringBuilder

    este foarte comun pentru a vedea oamenii muta la ArrayList din matrice. Dar vine dintr-un moment în care C# nu avea suport generic., ArrayList este depreciat în suport pentru generic List

    Lista Generică

    Un tip generic este un tip special în C# care definesc un generalizate clasa, iar utilizatorul va specifica tipurile de date se va folosi atunci când l-a creat. Deci, dacă doriți o listă de numere sau siruri de caractere, te-ar defini pe care doriți 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 un pic cu using namespace declarație în PowerShell 5 și mai noi. Declarația using trebuie să fie prima linie a scriptului. Prin declararea unui spațiu de nume, PowerShell vă va permite să î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 List mult mai ușor de utilizat.

    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> $myList 10

    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") Zero One Three

    când lucrați cu tipuri de valori, acesta va elimina 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 obiectul pe care doriți eliminat.

     ]$drives = Get-PSDrive $drives.remove($drives)
     $delete = $drives $drives.remove($delete)

    elimina metoda va returna 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 aspect pe care Mark Kraus l-a 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 este creată. Putem crea o matrice cu o dimensiune predeterminată apelând-o cu constructorul new($size).,

     $data = ]::new(4) $data.count 4

    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 * 3 red green blue red green blue red green blue

    Inițializa cu 0

    Un scenariu comun este că doriți să creați o matrice cu toate zerouri. Dacă aveți doar de gând să aibă numere întregi, o matrice puternic tastat de numere întregi va implicit la toate zerouri.

     PS> ]::new(4) 0 0 0 0

    putem folosi trucul de multiplicare pentru a face acest lucru.,

     PS> $data = @(0) * 4 PS> $data 0 0 0 0

    lucrul frumos despre trucul de multiplicare este că puteți utiliza orice valoare. Deci, dacă preferați să aveți 255 ca valoare implicită, aceasta ar fi o modalitate bună de a face acest lucru.

     PS> $data = @(255) * 4 PS> $data 255 255 255 255

    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-o grilă ca model.

    iată două moduri în care putem crea o matrice 2 dimensională.,

     $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 o matrice normală pe mai multe linii în cazul în care virgula a fost 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 = 0 PS> $inside = 2 PS> $data 3

    adăugați un set de suport pentru fiecare nivel de matrice cuiburi., Primul set de paranteze este pentru cea mai mare matrice exterioară și apoi lucrați de acolo.

    Write-Output-NoEnumerate

    PowerShell îi place să despacheteze sau enumera matrice. Acesta este un aspect de bază al modului în care PowerShell folosește conducta, dar există momente în care nu doriți să se întâmple asta.

    i de obicei obiecte de țeavă la Get-Member pentru a afla mai multe despre ele. Când am țeavă o matrice să-l, acesta devine unwrapped și Get-membru vede membrii matrice și nu matrice reală.,

     PS> $data = @('red','green','blue') PS> $data | Get-Member TypeName: System.String ...

    Pentru a preveni ca desface de matrice, puteți folosi Write-Object -NoEnumerate.

     PS> Write-Output -NoEnumerate $data | Get-Member TypeName: System.Object ...

    am un al doilea mod de a face acest lucru, care este mai mult de un hack (și încerc să evite hacks ca aceasta). Puteți plasa o virgulă în fața matricei înainte de a o pipa.

     PS> ,$data | Get-Member TypeName: System.Object ...

    Returneze un array

    Acest onu-ambalaj de tablouri, de asemenea, se întâmplă atunci când ieșire sau valoarea returnată de o funcție., Puteți obține în continuare un tablou dacă atribuiți ieșirea unei variabile, astfel încât aceasta nu este de obicei o problemă.captura este că veți avea o nouă matrice. Dacă aceasta este vreodată o problemă, puteți utiliza Write-Output -NoEnumerate $arraysau return ,$array pentru a rezolva problema.

    altceva?

    știu că toate acestea sunt multe de luat. Speranța mea este că veți învăța ceva din acest articol de fiecare dată când îl citiți și că se va dovedi a fi o referință bună pentru dvs. pentru mult timp., Dacă ați găsit acest lucru pentru a fi de ajutor, vă rugăm să-l împărtășească cu alții care credeți că va primi valoare din ea.

    de aici, v-aș recomanda să consultați o postare similară pe care am scris-o despre hashtables.

    Lasă un răspuns

    Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *