2016-11-24 5 views
3

Angenommen, ich ein paar Arrays haben:Wie kann ich eine leere Liste anstelle von null erhalten?

$a = 1,2,3 
$b = 4,5,6 

und ich erhalte die Kreuzung (leer):

$c = $a |?{$b -contains $_} 

Ich würde $c erwartet, wie eine leere Liste enthalten, dass ich tun konnte:

$c.length 

aber ich weiß nicht. Ich bekomme eine $null (die eine Ausnahme bei der Abfrage für .length ausgibt). Wie kann ich stattdessen eine leere Liste zurück bekommen?

+0

$ null.Length 0 zurück, mit Powershell 5 –

+0

Was ist Ihre Powershell-Version? – Matt

+0

der Code, den ich getestet habe, lief auf 4.0 – ekkis

Antwort

5

es in dem Array-Konstruktor Wrap:

$c = @($a | ? { $b -contains $_ }) 
1

andere Lösung

$c = ($a |?{$b -contains $_}) ,@() 
+0

AFAICS, '$ c.length' wird immer' 2' hier zurückgeben. – PetSerAl

1

Ich würde erwarten, erwarten, $ c enthält eine leere Liste

Sie sollten nicht Das ist kein Python-ähnliches Listenverständnis, das immer eine Liste aufbaut - auch wenn die Liste leer ist.

Es ist ein Putting-Objekte durch die Rohrleitung, durch einen Filtertest, und Speichern der Pipeline ausgegeben. Wenn nichts durch den Filter kommt, gibt es keine Ausgabe zum Speichern. Die Pipeline erzeugt kein leeres Array aus dem Nichts - das wäre irreführend und ärgerlich. Hier wird die Antwort über das Array-Konstruktor herkommt - Umwickeln mit @(...) ist ein Array mit der Pipeline-Ausgang als Inhalt Aufbau und kein Ausgabemittel ein leeres Array.

Und Sie nehmen Risiken durch .Length statt .Count verwenden. z.B. wenn Sie mit Streichern das täte, dann wäre eine Kreuzung von nichts keine Länge zurück, eine Kreuzung zweier Einzelteile würden 2 zurück, aber eine Kreuzung von einem Punkt würde die Länge der Zeichenfolge zurück:

$a = 'abc','cde','def' 
$b = 'ghi','jkl','def' 

$c = $a |?{$b -contains $_} #c = 'def' 

$c.length # 1 item, length 3 

Es ist kein Problem, wenn Sie mit Zahlen arbeiten, die keine Längeneigenschaft haben, aber ich denke, es ist eine bessere Idee, gewöhnlich .Count zu verwenden, um die Anzahl der Elemente in einer Sammlung zu erhalten.

Siehe auch diese Antwort: https://stackoverflow.com/a/26513523/478656 für verwandte Diskussion über Länge vs Count-Eigenschaften und wie sie in PSv3 + geändert wurden, um das Arbeiten mit leeren Dingen einfacher zu machen.

Was mich zu Ihrem Anspruch bringt:

ich ein $null (die eine Ausnahme ausgibt, wenn für .length abgefragt)

Es ... nicht?

($null).Length # $null in PSv2, 0 in PSv4, PSv5.1. No exception. 

Es sei denn, Sie laufen im "strikten" Modus?

+1

in Bezug auf die Ausnahme ... du bist richtig. es scheint .Länge ist speziell. Die Ausnahme wurde bei einem Aufruf von .GetType() erzeugt, das mit einem "Sie können eine Methode für einen nullwertigen Ausdruck nicht aufrufen" erzeugt. – ekkis

+1

Ich wählte Esperento57's Antwort, weil es tatsächlich die Frage beantwortet, aber ich +1 Ihre Antwort für sein gut durchdacht und ich stimme zu, dass .Count ist eine bessere Herangehensweise und eine, auf die ich wechseln werde – ekkis

Verwandte Themen