C# C# / Powershell - Frage zu Generic.Dictionary

pizza4ever

Lt. Commander
Registriert
Apr. 2009
Beiträge
1.665
Hallo,

ich habe mal ein bisschen mit Gerneric Dictonaries gespielt in Powershell gespielt und folgendes läuft auch grundsätzlich so wie ich es erwarte:

Code:
$dictionary = New-Object System.Collections.Generic.Dictionary"[String,Object]"
$dictionary.Add("Computer5", @{T1 = '192.168.10.13'; T2 = '192.168.10.14'})

$dictionary['Computer5']['T2']


Ich habe ein paar Fragen dazu:

1.) Kann ich was verbessern oder sind mit aktuellen dotnet Frameworks Generic Dictonaries das Mittel der Wahl? :-)
2.) Kann man den Value (Object in meinem Fall) irgendwie "fixieren", so dass an keiner Stelle im Script Werte, die nicht dem Schema entsprechen hinzugefügt werden können? Also z.B. Es muss immer T1 und T2 geben, aber niemals T4 oder so.
3.) Muss man bei Generics auch den Returen Code bei .add Nullen, also wie bei Arraylists ? $null = xxx.add(yyy)

Hoffe, dass die Fragen klar sind ;-)

Danke!
 
1. Da müsstest du schon erläutern, was du erreichen willst. Dictionaries sind grundsätzlich nicht verkehrt wo sie hinpassen.
2. Sicher, schreibe einen eigenen Typen, der eben nur die Properties T1 und T2 hat. Es ist dann halt kein Dictionary<string, object> mehr, sondern Dictionary<string, DeinTyp>.
3. Was soll das sein? Nie von gehört oder ich stehe komplett auf dem Schlauch, ist das etwas powershell-spezifisches?
 
Hi,

1.) Bringen Generic dictionaries gegenüber Powershell Hashtables die gleichen Vorteile wie Arraylists vs Arrays? Bringen sie überhaupt Vorteile gegenüber Powershell Hashtables oder kann man gleich bei denen bleiben?

2.) Merci

3.) Ich verweise mal auf einen Beitrag vom Febraur:

RalphS schrieb:
Arraylist.Add gibt einen int zurück, der schießt quer.

Schreib vor jedes $t.Add ein $null = davor. Das verwirft den Rückgabewert der Methode.

https://www.computerbase.de/forum/threads/ersetzen-innerhalb-eines-objektes-mit-variablen.1922507/

da ging es um den Code:

Code:
function f {
  [CmdletBinding()]Param()
  Write-Verbose 'f: Start'
  $t = New-Object 'System.Collections.ArrayList'
  $t.add('test1')
  $t.add('test2')
  $t.add('test3')
  Write-Host "während dem Funktionsaufruf"
Write-Host $t
  return , $t
}
[System.Collections.ArrayList]$things = f -verbose
Write-Host "Nach dem Funktionsaufruf"
Write-Host $things

https://murrahjm.github.io/Hashtables-and-Dictionaries/

nach dem Studium kann man schon sagen, dass man $null brauchen wird.
 
Naja, C# empfiehlt Hashtables durch was anderes zu ersetzen -- zB Dictionary<string,object> -- weil Hashtables Status Deprecated haben und aus Net 2.x stammen. Wie das mit PS ist... keine Ahnung.

Ansonsten ist für die gewünschte Anforderung eine definierte Objektklasse das Mittel der Wahl. Entweder als PS-Definition (ab Version 5 oder so) oder ganz normal als .CS-Datei, die man dann mit Add-Type -Definition in Powershell dynamisch kompilieren und hinzufügen kann.

IMO machen Dictionaries insbesondere in PS nur Sinn, wenn man wirklich diese Typsicherheit haben will. Ansonsten sind Hashtables ja einfach assoziierte Arrays mit Strings als Schlüsseln, wohingegen Dictionaries<T1,T2> beliebig festzulegende Typen für Key und Value erwarten. Hashtables fressen mehr oder weniger alles. Dictionaries nicht.
 
  • Gefällt mir
Reaktionen: pizza4ever
RalphS schrieb:
Ansonsten ist für die gewünschte Anforderung eine definierte Objektklasse das Mittel der Wahl. Entweder als PS-Definition (ab Version 5 oder so) oder ganz normal als .CS-Datei, die man dann mit Add-Type -Definition in Powershell dynamisch kompilieren und hinzufügen kann.

also praktisch so? https://4sysops.com/archives/powershell-classes-part-1-objects/

Class Author {
$FirstName = 'Stéphane'
$LastName = 'van Gulick'
$WebSite = 'www.powershelldistrict.Com'
}
New-Object Author

Und dann ein Hashtable mit Value = die Klasse, oder habe ich dich falsch verstanden?

Irgendwie sind dann aber Klassen in Powershell sehr angespeckt gegenüber dem, was man normalerwieser unter eine Klasse versteht, oder? (in PS ist es dann ja nur ein Datentyp...?)
 
Zurück
Oben