• 10/08/2020
  • 24 minuuttia lukea
    • j
    • h
    • s
    • V

Taulukot ovat keskeinen kielen piirre useimmissa ohjelmointikieliä. Ne ovat kokoelma arvomerkkejä tai esineitä, joita on vaikea välttää. Katsotaan tarkkaan, mitä pöydät tarjoavat.,

Huom.

alkuperäinen versio tämän artikkelin ilmestyi blogi kirjoittanut @KevinMarquette. ThePowerShell-tiimi kiittää Keviniä tämän sisällön jakamisesta kanssamme. Tutustu hänen blogi atPowerShellExplained.com.

Mikä on array?

aion aloittaa perus-tekninen kuvaus siitä, mitä taulukot ovat ja miten niitä käytetään bymost ohjelmointikieliä, ennen kuin minä siirtää muita tapoja PowerShell käyttää niitä.

an array on tietorakenne, joka toimii useiden kohteiden kokoelmana., Voit iteroida yli thearray tai käyttää yksittäisiä kohteita indeksillä. Array on luotu juokseva murikka ofmemory, jossa jokainen arvo on tallennettu vieressä muut.

kosketan jokaista niistä yksityiskohdista kun mennään.

peruskäyttö

Koska ryhmät ovat niin perus ominaisuus PowerShell, on yksinkertainen syntaksi toimii heikkenee Powershellissä.,

Luoda array

tyhjä joukko voidaan luoda käyttämällä @()

PS> $data = @()PS> $data.count0

Me voimme itse luoda array ja siementen kanssa arvot vain asettamalla ne @() suluissa.

PS> $data = @('Zero','One','Two','Three')PS> $data.count4PS> $dataZeroOneTwoThree

tällä listalla on 4 kohdetta. Kun kutsumme $data muuttuja, näemme luettelon kohteistamme. Jos se on anarray Jouset, niin saamme yhden rivin per merkkijono.

Voimme julistaa array useita rivejä. Pilkku on tässä tapauksessa valinnainen ja yleensä leftout.,

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

olen mieluummin julistaa minun taulukot useita rivejä, kuten että. Ei vain se saa helpommin lukea, kun sinulla on useita kohteita, se myös helpottaa verrata aiempiin versioihin käytettäessä sourcecontrol.

Muut syntaksi

on yleisesti tiedossa, että @() syntaksi on luoda array, mutta pilkulla erotettu listswork suurimman osan ajasta.,

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

Kirjoita-Tuotos luoda taulukot

Yksi viileä temppu syytä mainita, on, että voit käyttää Write-Output nopeasti luoda stringsat konsoli.

$data = Write-Output Zero One Two Three

Tämä on kätevä, koska sinun ei tarvitse laittaa lainausmerkkeihin jouset, kun parametri acceptsstrings. En koskaan tekisi tätä käsikirjoituksessa, mutta se on reilua peliä konsolissa.

Accessing kohteita

Nyt sinulla on array kohteita, sitä kannattaa käyttää ja päivittää niitä kohteita.,

Korvata

käyttää yksittäisiä kohteita, käytämme suluissa offset-arvo alkaa 0: sta. Tämä ishow saamme ensimmäinen erä meidän joukko:

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

syy miksi käytämme nolla tässä on, koska ensimmäinen erä on alussa lista, joten olemme usean offset 0 kohteita saada se. Päästä toiseen erään, meidän pitäisi käyttää offset 1 toskip ensimmäinen erä.

PS> $dataOne

Tämä tarkoittaisi sitä, että viimeinen erä on offset-3.,

PS> $dataThree

Indeksi

Nyt voit nähdä, miksi valitsin arvoja, jotka tein tätä esimerkkiä varten. Esittelin tätä offsetbecause, että on, mitä se todella on, mutta tämä poikkeama on yleisesti nimitystä hakemisto. Anindex, joka alkaa 0. Tämän kirjoituksen loppuosaa kutsun offsetiksi indeksin.

Erityinen indeksi temppuja

useimmissa kielillä, voit määrittää vain yhden numeron indeksi ja saat yhden kohteen takaisin.PowerShell on paljon joustavampi. Voit käyttää useita indeksejä kerralla., Antamalla luettelonindekseistä, voimme valita useita kohteita.

PS> $dataZeroTwoThree

kohteet palautetaan tilauksen perusteella indeksit tarjotaan. Jos kopioit indeksin, saat sen molemmilla kerroilla.

PS> $dataThreeZeroThree

Voimme määritä numerosarja, jossa on sisäänrakennettu .. operaattori.

PS> $dataOneTwoThree

Tämä toimii käänteisesti myös.

PS> $dataThreeTwoOne

Voit käyttää negatiiviset indeksin arvot tasoittamaan lopussa. Joten jos tarvitset listan viimeisen kohteen, voit käyttää -1.,

PS> $dataThree

kielletty

useimmissa kielissä, jos yrität käyttää indeksi kohde, joka on aiemmin taulukon loppuun, youwould saada jonkinlainen virhe tai poikkeus. PowerShell hiljaa palauttaa mitään.

PS> $null -eq $dataTrue

Ei indeksinä null array

Jos muuttuja on $null ja yrität indeksi kuin array, saatSystem.Management.Automation.RuntimeException poikkeus viestiCannot index into a null array.,

PS> $empty = $nullSP> $emptyError: Cannot index into a null array.

Joten varmista, että paneelit eivät ole $null ennen kuin yrität käyttää elementtejä sisällä.

Laskea

Taulukot ja muut kokoelmat on määrä omaisuutta, joka kertoo, kuinka monta kohdetta ovat joukko.

PS> $data.count4

PowerShell 3.0 lisäsi kreivin ominaisuuden useimpiin esineisiin. sinulla voi olla yksi esine ja se shouldgive et lasken 1.

PS> $date = Get-DatePS> $date.count1

Jopa $null on määrä omaisuutta kuin se palaa 0.,

PS> $null.count0

On olemassa joitakin ansoja täällä, että aion palata, kun olen kattaa tarkistamalla $null tai tyhjä arrayslater tässä artikkelissa.

Off-by-one-virheet

yleinen ohjelmointivirhe syntyy, koska matriisit alkavat indeksistä 0. Off-by-one virheet voidaan ottaa käyttöön kahdella tavalla.

ensimmäinen on henkisesti ajattelu haluat toisen kohteen ja käyttää indeksi 2 ja todella gettingthe kolmas erä. Tai ajattelemalla, että sinulla on neljä kohdetta ja haluat viimeisen kohteen, joten käytät counto käyttää viimeistä kohdetta.,

$data

PowerShell on täysin onnellinen anna sinun tehdä sitä ja antaa sinulle täsmälleen, mitä kohde on olemassa indeksi 4:$null. Sinun pitäisi käyttää $data.count - 1 tai -1 että olemme oppineet edellä.

PS> $dataThree

Tämä on, jos voit käyttää -1 indeksi saada viimeinen osa.

PS> $dataThree

Lee Dailey myös huomautti minulle, että voimme käyttää $data.GetUpperBound(0) saada max indexnumber.,

PS> $data.GetUpperBound(0)3PS> $dataThree

toiseksi yleisin tapa on, kun iteroimalla luettelosta ja pysäyttää oikeaan aikaan. Puhun tästä, kun puhumme for – silmukan käyttämisestä.

päivittäminen kohteita

Voimme käyttää samaa indeksiä päivittää olemassa olevia kohteita array. Tämä antaa meille suora pääsy tupdate yksittäisiä kohteita.

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

Jos yritämme päivittää kohteen joka on aiemmin viimeinen osa, sitten saammeIndex was outside the bounds of the array. virhe.

palaan asiaan myöhemmin, Kun puhun siitä, miten array saadaan suuremmaksi.,

Toisto

jossain vaiheessa, ehkä kävellä tai kerrata koko lista ja suorittaa joitakin toimia eachitem array.

Pipeline

Matriisit ja PowerShell-putki on tarkoitettu toisilleen. Tämä on yksi yksinkertaisimmista tavoista käsitellä näitä arvoja. Kun siirrät array putkeen, jokainen kohde sisällä array isprocessed yksilöllisesti.

PS> $data = 'Zero','One','Two','Three'PS> $data | ForEach-Object {"Item: "}Item: Item: Item: Item: 

Jos et ole nähnyt $PSItem ennen, vain tietää, että se on sama asia kuin $_., Voit käyttää eitheronea, koska molemmat edustavat putkistossa olevaa nykyistä esinettä.

ForEach silmukka

ForEach silmukka toimii hyvin kokoelmista. Käyttää syntax:foreach ( <variable> in <collection> )

foreach ( $node in $data ){ "Item: "}

ForEach menetelmällä

minulla on tapana unohtaa tämä yksi, mutta se toimii hyvin yksinkertainen toiminta. Powershellilla voit tocall .ForEach() kokoelmalla.

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

.foreach() vie parametri, joka on skripti estää., Voit pudottaa sulkeet ja justprovide script lohko.

$data.foreach{"Item "}

Tämä on vähemmän tunnettu syntaksia, mutta se toimii aivan sama. Tämä foreach menetelmä lisättiin inPowerShell 4.0.

silmukka

for silmukka käytetään voimakkaasti useimmissa muissa kielissä, mutta et näe sitä paljon PowerShell. Kun näet sen, se on usein yhteydessä kävely array.

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

ensimmäinen asia mitä teemme on alustaa an $index ja 0., Sitten me lisätä ehto, että $index niitä on vähemmän kuin $data.count. Lopuksi tarkennamme, että joka kerta kun silmukkaamme, että minun täytyy lisätä theindexiä 1. Tässä tapauksessa $index++ lyhenne $index = $index + 1.

Kun käytät for silmukka, kiinnitä erityistä huomiota niiden kunto. Käytin$index -lt $data.count tässä. On helppo saada tila hieman väärin saada off-by-one-virhe logiikassasi., Käyttäen $index -le $data.count tai $index -lt ($data.count - 1) eivät koskaan soslightly väärin. Se aiheuttaisi tuloksen käsitellä liikaa tai liian vähän kohteita. Tämä on taclassic off-by-one virhe.

Vaihtosilmukka

Tämä on sellainen, joka on helppo unohtaa. Jos annat array kytkin lausuma, sechecks kunkin kohteen array.

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

On olemassa paljon hienoja asioita, joita voimme tehdä, että kytkin selvitys. Minulla on toinen artikoitu tähän.,

  • Kaikki mitä olet ikinä halunnut tietää kytkin selvitys

arvojen Päivittäminen

Kun joukko on kokoelma merkkijono tai kokonaislukuja (arvo tyypit), voidaan joskus toupdate arvot array kuten silmukka niiden yli. Suurin osa yllä olevista silmukoista käyttää muuttujaa theloopissa, jolla on kopio arvosta. Jos päivität muuttujan, matriisin alkuperäistä arvoa ei päivitetä.

poikkeus, että lausunto on for silmukka., Jos haluat kävellä array ja päivittää valuesinside se, sitten for silmukka on mitä etsit.

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

Tämä esimerkki ottaa arvon indekseittäin, tekee muutamia muutoksia ja käyttää sitten samaa indeksiä siirtääkseen takaisin.

objektien ryhmät

toistaiseksi ainoa asia, jonka olemme sijoittaneet matriisiin, on arvotyyppi, mutta matriisit voivat sisältää myös objekteja.

$data = @( @{FirstName='Kevin';LastName='Marquette'} @{FirstName='John'; LastName='Doe'})

Monet cmdlets palata kokoelmat esineitä, kuten taulukot, kun annat heille muuttuja.,

$processList = Get-Process

– Kaikki perus ominaisuudet olemme jo puhuneet, sovelletaan edelleen paneelit esineitä fewdetails syytä huomauttaa.

Accessing ominaisuudet

Voimme käyttää indeksi käyttää yksittäisen nimikkeen kokoelma aivan kuten arvon tyyppejä.

PS> $dataFirstName LastName----- ----Kevin Marquette

Voimme käyttää ja päivittää ominaisuuksia suoraan.,

PS> $data.FirstNameKevinPS> $data.FirstName = 'Jay'PS> $dataFirstName LastName----- ----Jay Marquette

Array ominaisuudet

Yleensä sinun olisi pitänyt luetella koko lista, kuten tämä, jos haluat käyttää kaikkia ominaisuuksia:

PS> $data | ForEach-Object {$_.LastName}MarquetteDoe

Tai käyttämällä Select-Object -ExpandProperty cmdlet-komentoa.

PS> $data | Select-Object -ExpandProperty LastNameMarquetteDoe

Mutta PowerShell tarjoaa meille mahdollisuuden pyytää LastName suoraan. PowerShell luettelee ne meille ja palauttaa puhtaan listan.

PS> $data.LastNameMarquetteDoe

luettelointi tapahtuu edelleen, mutta emme näe sen takana olevaa monimutkaisuutta.,

Where-Object suodatus

Tämä on, jossa Where-Object tulee niin voimme suodattaa ja valita, mitä haluamme ulos arraybased ominaisuuksia esine.

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

– Voimme kirjoittaa, että saman kyselyn saada FirstName etsimme.

$data | Where FirstName -eq Kevin

, Missä()

Taulukot ovat Where() tapa ne, jonka avulla voit määrittää scriptblock suodatin.

$data.Where({$_.FirstName -eq 'Kevin'})

Tämä ominaisuus lisättiin PowerShell 4.0.,

Päivittäminen esineitä silmukoita

arvon tyypit, ainoa tapa päivittää array on käyttää for-silmukan, koska meidän täytyy tietää, theindex korvata arvo. Meillä on enemmän vaihtoehtoja objektien kanssa, koska ne ovat referenssityyppejä. Tässä nopea esimerkki:

foreach($person in $data){ $person.FirstName = 'Kevin'}

Tämä silmukka on kävely jokainen esine $data array. Koska esineet ovat viittaus tyypit,$person muuttuja viittaa täsmälleen sama kohde, joka on array. Joten päivitykset itsproperties eivät päivitä alkuperäinen.,

et vieläkään voi korvata koko objektia näin. Jos yrität määrittää uuden objektin$person muuttuja, olet päivittämässä muuttujan viittaus jotain muuta, joka ei enää viittaa alkuperäiseen objektiin array. Tämä ei toimi kuten voisi odottaa:

foreach($person in $data){ $person = @{ FirstName='Kevin' LastName='Marquette' }}

Operaattorit

toimijoiden PowerShell myös taulukot. Osa niistä toimii hieman eri tavalla.

liittyä

-join operaattori on kaikkein ilmeinen, joten katsotaanpa se ensimmäinen., Pidän -joinoperaattorista ja käytän sitä usein. Se liittyy kaikki elementit array merkki tai merkkijono, jonka määrität.

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

Yksi ominaisuuksia, että pidän siitä -join operaattori on se, että se käsittelee yhden kohteita.

PS> 1 -join '-'1

käytän tätä sisällä hakkuut ja sanalliset viestit.

PS> $data = @(1,2,3,4)PS> "Data is $($data -join ',')."Data is 1,2,3,4.

-liity $array

Tässä on näppärä temppu, että Lee Dailey huomautti minulle., Jos haluat liittyä everythingwithout erotin, sen sijaan näin:

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

Voit käyttää -join kanssa array parametri, jossa ei ole etuliitettä. Katso tätä esimerkkiä tosee, että puhun.

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

-korvata ja -split

muita operaattoreita, kuten -replace ja -split suorittaa kunkin kohteen array. En voi sanoa, että olen koskaan käyttänyt niitä näin, mutta tässä on esimerkki.,

PS> $data = @('ATX-SQL-01','ATX-SQL-02','ATX-SQL-03')PS> $data -replace 'ATX','LAX'LAX-SQL-01LAX-SQL-02LAX-SQL-03

sisältää

-contains – operaattorin avulla voit tarkistaa joukko arvoja, nähdä, jos se sisältää specifiedvalue.

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

sisään

Kun sinulla on yksittäinen arvo, joka haluat tarkistaa otteluissa yksi useita arvoja, te canuse -in operaattori. Arvo olisi vasemmalla ja taulukon oikealla puolella: lle.

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

tämä voi tulla kalliiksi, jos lista on suuri. Käytän usein regex-mallia, jos tarkistan enemmän thana-arvoja.,

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

-eq ja -ne

Tasa-arvo ja taulukot voi saada monimutkainen. Kun array on vasemmalla puolella, jokainen kohde saavahvistettu. Sen sijaan palaa True, se palauttaa objektin, joka vastaa.

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

Kun käytät -ne operaattori, saamme kaikki arvot, jotka eivät vastaa meidän arvo.

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

Kun käytät tätä if() lausunto, arvo, joka palautetaan on True arvo., Jos arvoa ei palauteta, se on False arvo. Molemmat seuraavista lausunnoista arvioivat True.

$data = @('red','green','blue')if ( $data -eq 'green' ){ 'Green was found'}if ( $data -ne 'green' ){ 'And green was not found'}

otan uudelleen tämä hetki, kun puhumme testaus $null.

ottelu

-match operaattori yrittää yhdistää jokaisen kohteen kokoelma.

PS> $servers = @( 'LAX-SQL-01' 'LAX-API-01' 'ATX-SQL-01' 'ATX-API-01')PS> $servers -match 'SQL'LAX-SQL-01ATX-SQL-01

Kun käytät -match yhdellä arvo, erityinen muuttuja $Matches saa asuttuja matchinfo., Näin ei ole, kun array käsitellään näin.

voimme omaksua saman lähestymistavan Select-Stringkanssa.

$servers | Select-String SQL

olen lähemmin Select-String,-match ja $matches muuttuja toiseen virkaan calledThe monia tapoja käyttää regex.

$null tai tyhjä

Testaus $null tai tyhjät taulukot voi olla hankalaa. Tässä ovat yhteiset ansat, joissa on taulukoita.

yhdellä silmäyksellä tämä lausunto näyttää siltä, että sen pitäisi toimia.,

if ( $array -eq $null){ 'Array is $null'}

Mutta minä vain meni läpi, kuinka -eq tarkistaa kunkin kohteen array. Niin meillä voi olla erilaisia severalitems yhdellä $null-arvoa ja se olisi arvioitava $true

$array = @('one',$null,'three')if ( $array -eq $null){ 'I think Array is $null, but I would be wrong'}

Tämä on, miksi se on parasta sijoittaa $null vasemmalla puolella operaattori. Tämä tekee skenaariosta ei-aiheisen.

if ( $null -eq $array ){ 'Array actually is $null'}

$null array ei ole sama asia kuin tyhjä joukko. Jos tiedät, että sinulla on array, tarkista määrä esineitä siinä., Jos matriisi on $null kreivi 0.

if ( $array.count -gt 0 ){ "Array isn't empty"}

Siellä on yksi ansa varoa täällä. Voit käyttää count vaikka sinulla on singleobject, paitsi että kohde on PSCustomObject. Tämä on vika, joka on vahvistettu Powershellissa 6.1.Se on hyvä uutinen, mutta monet ihmiset ovat edelleen 5.1 ja täytyy varoa sitä.

PS> $object = @{Name='TestObject'}PS> $object.count$null

Jos olet edelleen PowerShell 5.1, voit kääri objektin array ennen tarkkailun laskea estämään tarkkaa lukua.,

if ( @($array).count -gt 0 ){ "Array isn't empty"}

Jotta täysin pelata varman päälle, tarkista $null tarkista sitten laskea.

if ( $null -ne $array -and @($array).count -gt 0 ){ "Array isn't empty"}

Kaikki -eq

olen viime aikoina nähnyt joku kysyy, miten voidaan varmistaa, että jokainen arvo array vastaa tiettyä arvoa.Reddit-käyttäjällä / u / bis: llä oli tämä näppärä ratkaisu, joka tarkistaa virheelliset arvot ja näpäyttää tuloksen.

$results = Test-Somethingif ( -not ( $results -ne 'Passed') ){ 'All results a Passed'}

Lisäämällä taulukot

tässä vaiheessa olet alkanut ihmetellä, miten lisätä kohteita array. Nopea vastaus on, että et voi. Array on kiinteä koko muistin., Jos sinun täytyy kasvattaa sitä tai lisätä yhden kohteen siihen, sinun täytyy luoda uusi array ja kopioida kaikki arvot yli vanha array. Tämä kuulostaa paljon työtä, kuitenkin, PowerShell piilottaa monimutkaisuus luoda uusi taulukko. PowerShellimplements the addition operator (+) for arrays.

Huomautus

PowerShell ei toteuta vähennysoperaatiota. Jos haluat joustavan vaihtoehdon anarraylle, sinun on käytettävä geneeristä List – objektia.,

Array lisäksi

Voimme käyttää lisäksi operaattori paneelit luoda uuden taulukon. Näiden erotusten:

$first = @( 'Zero' 'One')$second = @( 'Two' 'Three')

– Voimme lisätä ne yhdessä saat uuden taulukon.

PS> $first + $secondZeroOneTwoThree

Plus vastaa +=

Me voimme itse luoda uuden taulukon käyttöön ja lisätä kohteen sen näin:

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

muista, että joka kerta, kun käytät += että olet päällekkäisiä ja luoda uuden taulukon. Tämä ei ole ongelma pienille tiedoille, mutta se skaalautuu erittäin huonosti.,

Putkitehtävä

voit määrittää minkä tahansa putken tulokset muuttujaksi. Se on array, jos se sisältää multipleitems.

$array = 1..5 | ForEach-Object { "ATX-SQL-$PSItem"}

Normaalisti kun ajattelemme käyttäen putki, ajattelemme tyypillinen PowerShell yksi-alukset. Voimme keskittää putken foreach() lausekkeilla ja muilla silmukoilla. Joten sen sijaan, että lisäämme kohteita anarray silmukka, voimme pudottaa kohteita putkistoon.

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

Array Tyyppejä

oletuksena, array PowerShell on luotu ] tyyppi., Tämä mahdollistaa sen sisältääon objektin tai arvon tyyppi. Tämä toimii, koska kaikki periytyy PSObject – tyypistä.

vahvasti tyypitetyt matriisit

voit luoda minkä tahansa tyyppisen joukon käyttäen samankaltaista syntaksia. Kun luot vahvasti kirjoitettu array,se voi sisältää vain arvoja tai esineitä määritetyn tyyppinen.

ArrayList

Lisäämällä kohteita array on yksi sen suurimmista rajoituksia, mutta on olemassa muutamia muita collectionsthat voimme kääntää, että ratkaista tämä ongelma.,

ArrayList on yleisesti yksi ensimmäisiä asioita, joita ajattelemme, kun me tarvitsemme array, joka isfaster työskennellä. Se toimii kuin objekti array jokainen paikka, että tarvitsemme sitä, mutta se käsittelee addingitems nopeasti.

Here is how we create an ArrayList and add its.

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

we are calling into.net to get this type. Tässä tapauksessa, käytämme oletuksena rakentaja luoda se. Sitten soitamme Add – menetelmään, jolla siihen lisätään tuote.,

syy, miksi käytän rivin alussa, on palauttaa koodi. Some.NET puhelut tekevät tämän ja voivat luoda odottamattoman tuotoksen.

Jos vain tiedot, että sinulla on teidän joukko on jouset, sitten myös katsomaan usingStringBuilder. Se on lähes sama asia, mutta on joitakin menetelmiä, jotka ovat vain käsitellä strings. StringBuilder on erityisesti suunniteltu suorituskykyä varten.

on yleistä, että ihmiset siirtyvät ArrayList – ryhmään matriiseista. Mutta se tulee ajalta, jolloin C# did ’ thave yleinen tuki., ArrayList on vanhentunut tukea geneeristen List

Geneeristen List

geneerinen tyyppi on erityinen tyyppi C#, joka määrittelee yleisen luokan ja käyttäjä määrittää tiedot tyypit, joita se käyttää, kun se on luotu. Joten jos haluat listan numeroita tai merkkijonoja, sinun olisi definethat haluat luettelo int tai string tyypit.

näin luot listan jousille.

$mylist = ]::new()

tai luettelo numeroista.,

$mylist = ]::new()

Emme voi heittää olemassa array lista, kuten tämä ilman, että luodaan objekti, ensimmäinen:

$mylist = ]@(1,2,3)

Voimme lyhentää syntaksi using namespace selvitys PowerShell 5 ja uudempi. using lausuman pitää olla käsikirjoituksen ensimmäinen rivi. Ilmoittamalla nimiavaruuden, PowerShelllets jätät sen pois tietotyypeistä, kun viittaat niihin.

using namespace System.Collections.Generic$myList = ]@(1,2,3)

Tämä tekee List paljon enemmän käytettävissä.,

sinulla on käytössäsi samanlainen Add – menetelmä. Toisin kuin ArrayList, ei ole paluuta arvo onthe Add menetelmä, joten meidän ei tarvitse void sitä.

$myList.Add(10)

Ja voimme edelleen käyttää elementtejä kuin muut ryhmät.

PS> $myList10

Lista

on lista tahansa, mutta kun et tiedä tyyppi esineitä, voit käyttää] sisältää niitä.,

$list = ]::new()

Poista()

ArrayList ja geneeristen List sekä tukea poistamalla kohteita kokoelma.

using namespace System.Collections.Generic$myList = ]@('Zero','One','Two','Three')$myList.Remove("Two")ZeroOneThree

arvotyyppien kanssa työskennellessään se poistaa listalta ensimmäisen. Voit kutsua sitä andover uudelleen poistaa että arvo. Jos sinulla on referenssityyppejä, sinun täytyy antaa objecthat haluat poistaa.,

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

poista-metodi palauttaa true jos se voi löytää ja poistaa kohteen kokoelma.

lisää kokoelmia

on monia muita mallistoja, joita voidaan käyttää, mutta nämä ovat hyviä geneerisiä matriisikorvauksia.Jos olet kiinnostunut oppimaan lisää näistä vaihtoehdoista, tutustu thisGist Thatmark Kraus yhteensä.

Muita vivahteita,

Nyt, että olen käsitellyt kaikki tärkeimmät toiminnot, tässä on muutamia asioita, jotka halusin tomention ennen kuin kääri tämä ylös.,

esikokoiset matriisit

mainitsin, että matriisin kokoa ei voi muuttaa, kun se on luotu. Voimme luoda joukon OFA ennalta määritetty koko kutsumalla sitä new($size) constructor.

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

Kertomalla taulukot

mielenkiintoinen pikku temppu on, että voit moninkertaistaa array kokonaisluku.

PS> $data = @('red','green','blue')PS> $data * 3redgreenblueredgreenblueredgreenblue

Alustaa, jossa 0

yhteinen skenaario on, että haluat luoda taulukon, jossa kaikki nollia. Jos olet vain menossa onintegrers, vahvasti kirjoitettu joukko kokonaislukuja oletuksena kaikki nollat.,

PS> ]::new(4)0000

Voimme käyttää kerrointemppua myös tähän.

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

kiva juttu kertomalla temppu on, että voit käyttää mitä tahansa arvoa. Joten jos sinulla olisi ratherhave 255 oletus arvo, tämä olisi hyvä tapa tehdä se.

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

Sisäkkäiset taulukot

array sisällä array kutsutaan sisäkkäisiä array. En käytä näitä paljon Powershellissa, mutta olen käyttänyt niitä enemmän muilla kielillä. Harkitse erilaisten ryhmien käyttämistä, kun tietosi sopivat gridmäiseen kuvioon.,

tässä on kaksi tapaa, joilla voimme luoda kaksiulotteisen matriisin.

$data = @(@(1,2,3),@(4,5,6),@(7,8,9))$data2 = @( @(1,2,3), @(4,5,6), @(7,8,9))

pilkku on näissä esimerkeissä erittäin tärkeä. Annoin aikaisemman esimerkin normaalista rivistä, jossa pilkku oli valinnainen. Näin ei ole moniulotteisen matriisin laita.

tapa, jolla käytämme indeksin merkintää muuttuu hieman nyt, kun meillä on sisäkkäinen array. Käyttämällä$data yllä, näin pääsisimme arvoon 3.

PS> $outside = 0PS> $inside = 2PS> $data3

Lisää joukko kiinnike kunkin tason array pesiä., Ensimmäinen suluissa on uloin array ja sitten työskentelet tiesi sieltä.

Kirjoita-Tuotos -NoEnumerate

PowerShell haluaa avata tai luetella taulukot. Tämä on keskeinen näkökohta tavalla PowerShell käyttää kanssa, mutta on hetkiä, että et halua, että näin tapahtuu.

i yleensä piippaa esineitä Get-Member oppiakseen niistä lisää. Kun piippaan array siihen, itgets unwrapped ja Get-jäsen näkee jäsenet array eikä todellinen array.,

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

estää sen avaamiseen array, voit käyttää Write-Object -NoEnumerate.

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

minulla on toinen tapa, että on enemmän hakata (ja yritän välttää hakata kuin tämä). Voit sijoittaa acomman array: n eteen ennen kuin piippaat sen.

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

Paluu array

Tämä purkaminen taulukot myös tapahtuu, kun lähtö tai paluu arvoja funktio. Voit silti saada array, jos annat lähtö muuttuja, joten tämä ei ole yleisesti ongelma.

saalis on, että sinulla on uusi array., Jos on koskaan ongelma, voit käyttääWrite-Output -NoEnumerate $array tai return ,$array kiertää se.

Anything else?