by Lembasts at 2013-02-13 15:14:49
Greetings,by teezee at 2013-02-13 17:52:20
Having been persuaded to use the system.collections.arraylist class instead of boring old arrays, I had a look at the methods and was wondering how to use some of these when your arraylist contains objects. For example, how do I sort on a property of the objects? How do I search on a property? how can I remove an array element without specifying an index? Or do arraylists containing objects not allow you to use certain methods?
I will admit that I’m very new to all this and I don’t want you to take this as an awnser simply because I couldn’t really understand the question very well and I don’t have much programmation background… all in all…by Lembasts at 2013-02-13 18:44:04
This is what I came with trying to figure out if that is what you’re talking about…
#setup arraylist
$arraylist = New-Object System.Collections.ArrayList
#get data
$list1 = Get-ChildItem -Directory -Recurse -Path "h:"
#get more data woohoo
$list2 = Get-ChildItem -Directory -Recurse -Path "d:"
#add object to list
$arraylist.Add($list1)
#add more vodka to the juice
$arraylist.Add($list2)
#list only the fullname of all the folders in $list2
$arraylist[1].fullname
#list only the second folder of $list2
$arraylist[1][1].fullname
#delete the fourt folder of $list1 recursively with all its files
#$arraylist[0][3].delete($true) – don’t do this at home..
#to search you can do some foreach...
#now I believe you see that there is alot more you can do from here.
Well that is what I understood :X
I can easily access the objects in the arraylist and the properties…its more about sorting on specific properties, searching on specific properties and using the remove without using an index.by mjolinor at 2013-02-14 05:25:57
Here’s an example of removing entries without using the index:by Lembasts at 2013-02-14 13:04:55$al = new-object collections.arraylist
gci c:\testfiles*.xml |
select name,length |
foreach {
$al.add($) > $null
}
'*'80
$al
''*80
foreach ($entry in ($al | where {$.length -gt 1mb} ))
{$al.remove($entry)}
$al
Very nice solution - thanks.by Lembasts at 2013-02-14 13:38:07
So can we do sorting and searching on specific object properties?
Just did a comparison and it turns out that using indexes for deletion:$mastermax = $master.count
for ($masteridx = 0;$masteridx -lt $mastermax;$masteridx++) {
if ($master[$masteridx].DateAD -eq "removed" -and
$master[$masteridx].Client -eq "no" -and
(Get-Date $master[$masteridx].lastlogontimestamp) -lt $oldtime -and
(Get-Date $master[$masteridx].PasswordLastSet) -lt $oldtime ) {
$master.removeat($masteridx)
$sumdel++
$masteridx–
$mastermax–
}
}
is around 3 to 4 times quicker than using objects:$mastermax = $master.count
foreach ($entry in ($master | where { $.DateAD -eq "removed" -and
$.Client -eq "no" -and
(Get-Date $.lastlogontimestamp) -lt $oldtime -and
(get-date $.PasswordLastSet) -lt $oldtime } )) {
$master.remove($entry)
$sumdel++
}