Matriser er en grunnleggende språk-funksjonen i de fleste programmeringsspråk. De er en samling av verdier eller objekter, og er derfor vanskelig å unngå. La oss ta en nærmere titt på matriser og alt de har å tilby.

  • Page Index
  • Hva er en matrise?,match
  • $null eller tom
    • Alle -eq
  • ved å Legge til matriser
    • Array tillegg
    • Pluss er lik +=
    • Rørledning oppdraget
  • Array Typer
    • Sterkt skrevet matriser
    • ArrayList
    • Generisk Liste
      • Liste
      • Fjern()
    • Flere samlinger
  • Andre nyanser
    • Pre-størrelse tabeller
    • å Multiplisere matriser
    • Initialisere med 0
    • Nestede tabeller
    • Skriv-Ut-NoEnumerate
      • Returnere et array
  • Noe annet?,
  • Hva er en matrise?

    jeg kommer til å begynne med en grunnleggende teknisk beskrivelse av hva matriser er og hvordan de blir brukt av de fleste programmeringsspråk før jeg skiftet til den andre måter PowerShell gjør bruk av dem.

    En matrise er en datastruktur som fungerer som en samling av flere elementer. Du kan iterere over tabellen eller få tilgang til enkelte elementer ved hjelp av en indeks. Tabellen er opprettet som en sekvensiell del av minnet der hver verdi er lagret rett ved siden av den andre.

    jeg vil komme inn på hver av disse detaljene som vi går.,

    Grunnleggende bruk

    på Grunn av matriser er en grunnleggende funksjon i PowerShell, det er en enkel syntaks for å arbeide med dem i PowerShell.

    Opprette en matrise med @()

    En tom matrise kan være opprettet ved hjelp av @()

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

    Vi kan lage en tabell og frø det med verdier bare ved å plassere dem innenfor @() parentes.

    – >

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

    Denne gruppen er 4 elementer. Når vi ringer $data variabel, kan vi se listen over våre produkter., Hvis det er en tabell av strenger, så vil vi ha en linje per strengen.

    Vi kan erklære et utvalg på flere linjer. Komma er valgfritt i dette tilfellet, og generelt utelatt.

    – >

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

    jeg foretrekker å erklære min arrays på flere linjer sånn. Ikke bare kan det bli lettere å lese når du har flere elementer, for det gjør det også lettere å sammenligne med tidligere versjoner når du bruker source control.,

    Andre syntaks

    Det er vanligvis forstått som @() er syntaksen for å opprette en array, men atskilt med komma lister fungerer mesteparten av tiden.

    – >

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

    Skriv Ut for å lage arrays

    Et kult lite triks som er verdt å nevne er at du kan bruke Write-Output for å raskt lage strenger på konsollen.

    – >

     $data = Write-Output Zero One Two Three

    Dette er praktisk fordi du ikke trenger å sette anførselstegn rundt strenger når parameteren aksepterer strenger., Jeg ville aldri gjøre dette i et manus, men det er fair spill på konsollen.

    få Tilgang til elementer

    Nå har du en matrise med elementer i det, kan du ønsker å få tilgang til og oppdatere disse elementene.

    Offset

    for Å få tilgang til enkelte elementene, vi bruker hakeparenteser med en forskyvningsverdi som starter på 0. Dette er hvordan får vi det første elementet i vårt utvalg:

    – >

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

    grunnen til At vi bruker null her er fordi det første elementet er i begynnelsen av listen, slik at vi bruker en forskyvning av 0 elementer for å få til det., For å komme til det andre elementet, vi ville trenge å bruke en forskyvning på 1 for å hoppe over det første elementet.

    – >

     PS> $data One

    Dette ville bety at det siste elementet er i offset 3.

    – >

     PS> $data Three

    Indeks

    Nå kan du se hvorfor jeg har valgt nettopp de verdier som jeg gjorde i dette eksemplet. Jeg introduserte dette som en forskyvning fordi det er hva det egentlig er, men denne forskyvningen er mer ofte referert til som en indeks. En indeks som starter med 0. For resten av denne artikkelen vil jeg kalle offset en indeks.,

    Spesielle indeks triks

    I de fleste språk, du kan bare oppgi en enkelt nummer som indeksen, og du vil få et enkelt element tilbake. PowerShell er mye mer fleksibel. Du kan bruke flere indekser på en gang. Ved å oppgi en liste over indekser, kan vi velge flere elementer.

    – >

     PS> $data Zero Two Three

    – elementer, vil bli returnert basert på rekkefølgen av indeksene er gitt. Hvis du duplisere en indeks, vil du få varen begge ganger.,

    – >

     PS> $data Three Zero Three

    Vi kan spesifisere en sekvens av tall med den innebygde .. operatør.

    – >

     PS> $data One Two Three

    Dette virker i motsatt også.

    – >

     PS> $data Three Two One

    Du kan bruke negitive indeksverdier til å motregne fra slutten. Så hvis du trenger det siste elementet i listen, kan du bruke -1.,

    – >

     PS> $data Three

    «Out of bounds»

    I de fleste språk, hvis du prøver å få tilgang til en indeks av et element som er forbi slutten av tabellen, vil du få noen form for feil, eller som et unntak. PowerShell vil automatisk gi deg noe.

    – >

     PS> $null -eq $data True

    Ikke-indeksen i en array null

    Hvis variabelen $null og du prøve å indeksere det som en matrise, du vil få en System.Management.Automation.RuntimeException unntak med meldingen Cannot index into a null array.,

    – >

     PS> $empty = $null SP> $empty Error: Cannot index into a null array.

    Så sørg for at din matriser er ikke $null før du prøver å få tilgang til elementer inni dem.

    Teller

    Matriser og andre samlinger har en teller eiendom som forteller deg hvor mange elementer som finnes i tabellen.

    – >

     PS> $data.count 4

    PowerShell 3.0 lagt til et count eiendom til de fleste objekter. du kan ha et enkelt objekt, og det bør gi deg en opptelling av 1.,

    – >

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

    Selv $null har en teller eiendom, bortsett fra at den returnerer 0.

    – >

     PS> $null.count 0

    Det er noen feller her, som jeg vil komme tilbake når jeg dekker sjekker for $null eller tomme tabeller senere i denne artikkelen.

    Av ved en feil

    En felles programmeringsfeil er opprettet på grunn av matriser start på indeks 0. Et av ved en feil kan bli introdusert i to meget vanlige måter.,

    Den første er ved mentalt å tro at du vil 2. element og bruke en indeks av 2 og virkelig får det tredje elementet. Eller ved å tro at du har 4 – elementer og du vil siste element, så vil du bare bruke størrelsen tilgang til det siste elementet.

    – >

     $data

    PowerShell er helt glad for å la deg gjøre det, og gi deg nøyaktig hva som objektet eksisterer på indeks 4, $null. Du bør bruke $data.count - 1 eller -1 at vi lærte om ovenfor.,

    – >

     PS> $data Three

    Dette er hvor du kan bruke -1 indeksen for å få det siste elementet.

    – >

     PS> $data Three

    Lee Dailey også påpekt for meg at vi kan bruke $data.GetUpperBound(0) for å få maks indeks nummer.

    – >

     PS> $data.GetUpperBound(0) Three

    Den nest mest vanlige måten er når iterating listen, og bare ikke å stoppe på rett tid. Jeg vil tilbake til dette når vi snakker om bruk av for repeterende.,

    Oppdatering elementer

    Vi kan bruke den samme indeksen for å oppdatere eksisterende elementer i tabellen. Dette gir oss direkte tilgang til å oppdatere individuelle elementer.

    – >

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

    Hvis vi forsøker å oppdatere et element som er forbi det siste elementet, og deretter får vi en Index was outside the bounds of the array. feil.

    jeg vil tilbake til dette senere når jeg snakker om hvordan å gjøre en rekke større.

    Iterasjon

    På et tidspunkt, vil du trenger å gå eller gå hele listen, og utføre noen handling for hvert element i matrisen.,

    Rørledning

    Matriser og PowerShell rørledningen er ment for hverandre. Dette er en av de enkleste måter å behandle over disse verdiene. Når du passerer en matrise til en rørledning, hvert element på innsiden tabellen er behandlet individuelt.

    – >

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

    Hvis du ikke har sett $PSItem før, bare vet at det er det samme som $_. Du kan bruke enten fordi de begge representerer det aktuelle objektet i rørledningen.,

    ForEach loop

    ForEach loop fungerer godt med samlinger. Ved hjelp av syntaks: foreach ( <variable> in <collection> )

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

    ForEach metode

    jeg har en tendens til å glemme dette, men det fungerer bra for enkle operasjoner. PowerShell som lar deg ringe .ForEach() på samlinger.

    – >

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

    .foreach() tar en parameter som er et script-blokken. Du kan droppe parentesene og bare gi skriptet blokk.,

    – >

     $data.foreach{"Item "}

    Dette er en mindre kjent syntaks, men det fungerer akkurat det samme. Denne foreach metoden ble lagt i PowerShell 4.0.

    For-løkke

    for loop er i stor grad brukes i de fleste andre språk, men som du ikke ser det mye i PowerShell. Når du ser det, er det ofte i sammenheng med gangavstand til en matrise.

    – >

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

    Det første vi gjør er å initialisere en $index til 0., Deretter legger vi på betingelse av at $index må være mindre enn $data.count. Til slutt vil vi presisere at hver gang vi loop som meg må øke index 1. I dette tilfellet $index++ er en forkortelse for $index = $index + 1.

    Når du bruker en for loop, betaler spesiell oppmerksomhet til tilstanden. Jeg brukte $index -lt $data.count her. Det er veldig lett å få tilstanden litt feil å få et av ved en feil i din logikk., Ved hjelp av $index -le $data.count eller $index -lt ($data.count - 1) er aldri så noe galt. Det ville føre til at resultatet til prosess for mange eller for få elementer. Dette er den klassiske av ved en feil.

    Slå loop

    Dette er en som er veldig lett å overse. Hvis du gir en matrise til en switch statement, det kamp på hvert element i matrisen.

    – >

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

    Dette vil gi dette resultatet:

    – >

     Tick Tock Tick Tock

    Det er mange kule ting som dette som vi kan gjøre med switch-setningen., Jeg har en artikkel som er dedikert til dette.

    • Alt du noensinne ønsket å vite om bytte uttalelse

    Oppdatere verdier

    Når gruppen er en samling av streng eller heltall (verdi-typer), noen ganger vil du ønsker å oppdatere verdiene i matrisen som du loop over dem. De fleste av looper over bruk en variabel i loop, som inneholder en kopi av verdi. Hvis du oppdaterer den variabelen, den opprinnelige verdien i tabellen er ikke oppdatert.

    Det unntak at uttalelsen er for repeterende., Hvis du ønsker å gå en matrise og oppdatere verdier inne i det, da for loop er hva du er ute etter.

    – >

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

    Dette er eksempler tar en verdi av indeksen, gjør noen endringer, og deretter bruker den samme indeksen for å gi det tilbake.

    – Tabeller av Objekter

    Så langt, det eneste vi har plassert i en matrise, er en verdi type, men arrays kan også inneholde objekter.

    – >

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

    Mange cmdlets tilbake samlinger av objekter som tabeller når du tilordne dem til en variabel.,

    – >

     $processList = Get-Process

    Alle de grunnleggende funksjonene vi allerede snakket om fortsatt gjelde for matriser av objekter med et par opplysninger verdt å peke på.

    få Tilgang til egenskaper

    Vi kan bruke en indeks for å få tilgang til en enkelt element i en samling i likhet med verdi-typer.

    – >

     PS> $data FirstName LastName ----- ---- Kevin Marquette

    Vi kan få tilgang til og oppdatere egenskaper direkte.,

    – >

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

    Array egenskaper

    du Vanligvis ville ha til å nummerere hele listen som dette for å få tilgang til alle egenskaper:

    – >

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

    Eller ved å bruke Select-Object -ExpandProperty cmdleten.

    – >

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

    Men PowerShell gir oss muligheten til å be om LastName direkte. PowerShell vil nummerere dem alle for oss, og gir oss en ren liste.,

    – >

     PS> $data.LastName Marquette Doe

    Den opplisting fortsatt skjer, men vi kan ikke se kompleksiteten bak det.

    Where-Object filtrering

    Dette er der Where-Object kommer i, slik at vi kan filtrere og velge ut hva vi ønsker ut av tabellen er basert på egenskapene til objektet.

    – >

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

    Vi kan skrive at samme spørring som dette for å få FirstName vi er ute etter.,

    – >

     $data | Where FirstName -eq Kevin

    Der()

    Matriser har en Where() metode på dem som gir deg mulighet til å angi en scriptblock for filter.

    – >

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

    Denne funksjonen ble lagt til i PowerShell 4.0.

    Oppdatering av objekter i looper

    Med verdi-typer, og den eneste måten å oppdatere tabellen er å bruke en for-løkke fordi vi trenger å vite indeksen til å erstatte verdien. Vi har flere alternativer med objekter fordi de er referanse typer., Her er et kjapt eksempel:

    – >

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

    Denne sløyfen er gangavstand til alle objektene i $data array. Fordi objektene er referanse typer, $person variabel referanser til samme objekt som er i tabellen. Så oppdateringer til det er egenskaper vil oppdatere den opprinnelige.

    Du fortsatt ikke kan erstatte hele objekt på denne måten. Hvis du prøver å tilordne en ny objekt til $person variabel, kan du oppdatere variabel referanse til noe annet som ikke lenger peker til det originale objektet i tabellen., Dette vil ikke fungere slik du ville forvente:

    – >

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

    Operatører

    operatørene i PowerShell også arbeide med matriser. Noen av dem fungerer litt annerledes.

    -bli med på

    -join operatør er den mest åpenbare, så vi får se på det første. Jeg liker den -join operatør og bruker det ofte. Det vil bli alle elementene i matrisen med en karakter eller en streng som du angir.,

    – >

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

    En av funksjonene jeg liker om -join operatør er at den håndterer enkelt elementer.

    – >

     PS> 1 -join '-' 1

    jeg bruker dette inne logging og detaljert meldinger.

    – >

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

    -bli med $array

    Her er et smart triks som Lee Dailey pekte ut for meg., Hvis du noen gang ønsker å bli med i alt uten skilletegn, i stedet for å gjøre dette:

    – >

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

    Du kan bruke -join med den matrisen som parameter uten prefiks. Ta en titt på dette eksemplet for å se at jeg snakker om.

    – >

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

    -sett -delt

    Den andre operatører som -replace og -split vil kjøre på hvert element i matrisen. Jeg kan ikke si jeg noensinne har brukt dem på denne måten, men her er et eksempel.,

    – >

     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

    -inneholder

    -contains operatør vil tillate deg å sjekke en rekke verdier for å se om den inneholder en bestemt verdi.

    – >

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

    -i

    Når du har en enkel verdi som du ønsker å kontrollere samsvarer med ett av flere verdier, kan du bruke -in operatør. Verdien vil være på venstre og tabellen på høyre side av drift.,

    – >

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

    Dette kan bli dyrt hvis listen er stor. Jeg bruker ofte en regex mønster hvis jeg sjekke mer enn 4-5 verdier.

    – >

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

    -eq-og -ne

    Likestillings-og arrays kan bli komplisert. Når gruppen er på venstre side, og hvert element vil bli sammenlignet. I stedet for å returnere True, det vil returnere objektet som matcher.,

    – >

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

    Når du bruker -ne operatør, vil vi få alle verdier som ikke er lik verdien vår.

    – >

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

    Når du bruker denne i en if() uttalelse, en verdi som returneres er en True verdi. Hvis ingen verdi er tilbake så er det en False verdi. Begge disse neste uttalelser vil vurdere å True.,

    – >

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

    jeg vil tilbake til dette i et øyeblikk når vi snakker om testing for $null.

    -match

    -match operatør vil prøve å matche et hvert element i samlingen.

    – >

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

    Når du bruker -match med en enkelt verdi, en spesiell variabel $Matches blir befolket med match info. Dette er ikke tilfelle når en tabell er behandlet på denne måten.

    Vi kan ta samme tilnærming med Select-String.,

    – >

     $servers | Select-String SQL

    jeg ta en nærmere titt på Select-String,-match og $matches variabel i et annet innlegg kalt mange måter å bruke regex.

    $null eller tom

    Testing for $null eller tom arrays kan være vanskelig. Her er de vanligste fellene med matriser.

    På et øyeblikk, dette utsagnet ser ut som det skal fungere.

    – >

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

    Men jeg bare gikk over hvordan -eq sjekker hvert element i tabellen., Så vi kan ha et utvalg av flere elementer med ett $null verdi, og det ville vurdere å $true

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

    Dette er hvorfor det er en beste praksis for å plassere $null på venstre side av operatøren. Dette gjør dette scenariet er en ikke-sak.

    – >

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

    En $null array er ikke det samme som en tom tabell. Hvis du vet du har en array, sjekk telling av objekter i det., Hvis matrise er $null, greven vil være 0.

    – >

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

    Det er en mer fellen å se opp for her. Du kan bruke count selv om du har et enkelt objekt, med mindre det objektet som er en PSCustomObject. Dette er en feil som er løst i PowerShell 6.1. Det er gode nyheter, men mange mennesker er fortsatt på 5.1 og trenger å se opp for det.

    – >

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

    Hvis du er fortsatt på PowerShell-5.,1, kan du vikle objekt i en matrise før du sjekker count å få en nøyaktig telling.

    – >

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

    for Å fullt spille det trygt, sjekk for $null, så sjekk teller.

    – >

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

    Alle -eq

    jeg nylig så noen spør hvordan du kontrollere at hver verdi i en tabell samsvarer med en gitt verdi. Reddit-brukeren /u/bis hadde denne smarte løsningen som kontrollerer for eventuelle feil verdier og så knipser resultatet.,

    – >

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

    Legge til tabeller

    På dette punktet, du begynner å lure på hvordan du legger til elementer i en matrise. Den raskt svar er at du ikke kan. En matrise er en fast størrelse i minnet. Hvis du trenger å vokse det eller legge til en enkelt element til det, så må du opprette en ny matrise og kopier alle verdier over fra den gamle tabellen. Dette høres dyrt og som mye arbeid, men PowerShell skjuler kompleksiteten i å skape den nye tabellen.

    Array tillegg

    Vi kan bruke i tillegg operatør med matriser for å opprette en ny tabell., Så gitt disse to matriser:

    – >

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

    Vi kan legge dem sammen for å få et nytt utvalg.

    – >

     PS> $first + $second Zero One Two Three

    Pluss er lik +=

    Vi kan lage en ny tabell i sted og legge til et element i det som dette:

    – >

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

    Bare husk at hver gang du bruker += at du er duplisere og opprette en ny tabell. Dette er ikke et problem for små datasett, men det skalerer svært dårlig.,

    Rørledning oppdraget

    Du kan tilordne resultater i rørledning til en variabel. Det vil være en matrise hvis den inneholder flere elementer.

    – >

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

    Vanligvis når vi tenker på ved hjelp av rørledningen, tenker vi på den typiske PowerShell one-liners. Vi kan utnytte rørledning med foreach() uttalelser og andre looper. Så i stedet for å legge elementer til en matrise i en loop, vi kan slippe elementer på rørledningen.,

    – >

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

    Ved å tilordne resultatene av foreach til en variabel, kan vi fange opp alle objektene og opprette én enkelt tabell.

    Array Typer

    standard, et utvalg i PowerShell er opprettet som en ] type. Dette gjør det mulig å inneholde alle typer gjenstand eller verdi. Dette fungerer fordi alt er arvet fra PSObject type.

    Sterkt skrevet matriser

    Du kan opprette en matrise av alle typer ved hjelp av en lignende syntaks., Når du oppretter et sterkt skrevet utvalg, det kan bare inneholde verdier eller objekter som er av den angitte typen.

    ArrayList

    ved å Legge elementer til en matrise er en av de største begrensningene, men det er et par andre samlinger som vi kan slå til som kan løse dette problemet.

    ArrayList er vanligvis en av de første tingene som vi tenker på når vi trenger en matrise som er raskere å jobbe med. Det fungerer som et objekt utvalg ethvert sted som vi trenger det, men det håndterer legge til elementer raskt.

    Her er hvordan skaper vi en ArrayList og legge til elementer i det.,

    – >

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

    Vi ringer inn .Net for å få denne typen. I dette tilfellet bruker vi standard konstruktør å lage det. Så vi kaller den Add metode for å legge til et element til det.

    grunnen til At jeg bruker i begynnelsen av linjen er å undertrykke returkoden. Noen .Internett-anrop kan gjøre dette og kan skape uventede utgang.

    Hvis bare data som du har i din matrise er strenger, da også ta en titt på ved hjelp av StringBuilder., Det er nesten det samme, men har noen metoder som er kun for å håndtere strenger. StringBuilder er spesielt utformet for ytelse.

    • Concatenate strenger å bruke StringBuilder

    Det er veldig vanlig å se folk gå til ArrayList fra-matriser. Men det kommer fra en tid hvor C# ikke har generell støtte., ArrayList er avskrevet i støtte for generisk List

    Generisk Liste

    En generisk type er en spesiell type i C# som definerer en generalisert klasse og brukeren vil angi datatyper vil den bruke når de opprettes. Så hvis du ønsker en liste av tall og strenger, ville du angi at du vil at listen over int eller string typer.

    Her er hvordan du opprette en Liste over strenger.

    – >

     $mylist = ]::new()

    Eller en liste for tall.,

    – >

     $mylist = ]::new()

    Vi kan kaste en eksisterende matrise til en liste som dette uten å lage objektet først:

    – >

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

    Vi kan redusere syntaks litt med using namespace uttalelse i PowerShell 5 og nyere. using uttalelse behov for å være den første linjen av skriptet. Ved å deklarere et navnerom, PowerShell vil la deg forlate den ut av datatyper når du refererer til dem.,

    – >

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

    Dette gjør List mye mer brukbare.

    Du har et lignende Add metode tilgjengelig for deg. I motsetning til den ArrayList, det er ingen retur-verdi på Add metode, slik at vi slipper å void det.

    – >

     $myList.Add(10)

    Og vi kan fortsatt få tilgang til elementer som andre matriser.,

    – >

     PS> $myList 10

    Liste

    Du kan ha en liste over alle type, men når du ikke vet hvilken type objekter, kan du bruke ] for å inneholde dem.

    – >

     $list = ]::new()

    Fjern()

    ArrayList og den generisk List både støtte fjerne elementer fra samlingen.

    – >

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

    Når du arbeider med verdi-typer, og det vil fjerne den første fra listen., Du kan kalle det igjen og igjen for å holde fjerne denne verdien. Hvis du har referanse typer, du har å gi objektet som du vil ha fjernet.

    – >

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

    fjern-metoden skal returnere true hvis det var i stand til å finne og fjerne elementet fra samlingen.

    Flere samlinger

    Det er mange andre samlinger som kan brukes, men disse er god generisk utvalg erstatninger., Hvis du er interessert i å lære mer om disse alternativene, kan du ta en titt på denne Hovedpunkt at Mark Kraus satt sammen.

    Andre nyanser

    Nå som jeg har dekket alle de store funksjonalitet, her er noen flere ting som jeg ønsket å nevne før jeg bryte opp dette.

    Pre-størrelse tabeller

    jeg nevnte at du ikke kan endre størrelsen på et utvalg når det er opprettet. Vi kan opprette en matrise av en forhåndsdefinert størrelse ved å ringe det med new($size) constructor.,

    – >

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

    Multiplisere matriser

    Et interessant lite trikset er at du kan multiplisere en matrise med et heltall.

    – >

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

    Initialisere med 0

    Et vanlig scenario er at du ønsker å opprette en matrise med bare nuller. Hvis du bare kommer til å ha heltall, et sterkt skrevet utvalg av heltall som standard til alle nuller.

    – >

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

    Vi kan bruke å multiplisere triks for å gjøre dette også.,

    – >

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

    Den fine tingen om å multiplisere trikset er at du kan bruke en hvilken som helst verdi. Så hvis du heller vil ha 255 som standard verdi, ville dette være en god måte å gjøre det på.

    – >

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

    Nestede tabeller

    En tabell inne i en matrise kalles en nestet tabell. Jeg bruker ikke disse mye i PowerShell, men jeg har brukt dem mer i andre språk. Vurder å bruke en rekke matriser når dataene passer inn i et rutenett som mønster.

    Her er to måter vi kan skape en 2-dimensjonal array.,

    – >

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

    komma er svært viktig i disse eksemplene. Jeg ga et tidligere eksempel på en normal utvalg på flere linjer hvor komma var valgfritt. Det er ikke tilfelle med en multi-dimensjonal array.

    Den måten vi bruker indeksen notasjon endringer litt nå som vi har en nestet tabell. Ved hjelp av $data ovenfor, dette er hvordan vi ville få tilgang til verdien 3.

    – >

     PS> $outside = 0 PS> $inside = 2 PS> $data 3

    Legg til et sett av brakett for hvert nivå av utvalg hekkende., Den første satt i parentes er for de ytre mest tabellen, og deretter kan du jobbe din vei i fra det.

    Skriv-Ut-NoEnumerate

    PowerShell liker å pakke opp eller spesifisere matriser. Dette er et sentralt aspekt av veien PowerShell bruker rørledningen, men det er tider som du ikke vil at det skal skje.

    jeg vanligvis rør objekter til Get-Member for å lære mer om dem. Når jeg pipe en matrise til det, det blir pakket inn og Bli-Medlem ser de medlemmer av spekter og ikke selve tabellen.,

    – >

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

    for Å hindre at pakk av tabellen, kan du bruke Write-Object -NoEnumerate.

    – >

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

    jeg har en annen måte å gjøre dette på som er mer av en hack (og jeg prøver å unngå hacks som dette). Du kan sette et komma foran på tabellen før du rør det.

    – >

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

    Returnere et array

    Denne fn-innpakning av matriser skjer også når du utgang eller returnere verdier fra en funksjon., Du kan fortsatt få en matrise hvis du tilordne utgang til en variabel, så dette er vanligvis ikke et problem.

    fangsten er at du vil ha et nytt utvalg. Hvis det er stadig et problem, kan du bruke Write-Output -NoEnumerate $array eller return ,$array for å omgå det.

    Noe annet?

    jeg vet dette er for mye å ta i. Mitt håp er at du vil lære noe fra denne artikkelen hver gang du leser det, og at det vil vise seg å være en god referanse for deg i lang tid framover., Hvis du fant denne til å være nyttig, kan du dele det med andre som du tror vil få verdi ut av det.

    Fra her, vil jeg anbefale deg å sjekke ut et lignende innlegg som jeg skrev om hashtables.

    Legg igjen en kommentar

    Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *