具有两个属性

时间:2018-03-02 15:19:13

标签: arrays powershell

我觉得我的德尔福背景正在破坏我解决这个问题的能力。我正在尝试在Powershell中创建一个空数组(没有数据,只是结构),其中每个项目都有两个属性。最终结果看起来像这样:

$WIP[0].signature = 'data'
$WIP[0].PID = 'data'
# other fake stuff in between
Write-host "Item 43 has signature:  " $WIP[43].signature

出于某种原因,我试图创造应该简单易行的每一次尝试。想法?

更新以回答问题

我知道有些人会做与以下类似的事情,但这并不像我想的那样灵活:

$array = @()
$object = New-Object -TypeName PSObject
$object | Add-Member -Name 'Name' -MemberType Noteproperty -Value 'Joe'
$object | Add-Member -Name 'Age' -MemberType Noteproperty -Value 32
$object | Add-Member -Name 'Info' -MemberType Noteproperty -Value 'something about him'
$array += $object

这需要在创建每个$对象时为所有三个成员提供值。我认为init看起来更像是(伪代码):

$MyRecord = {
    Signature as string
    PID as integer
}
$RecArray = array of $MyRecord

这显然是Delphi和Powershell的糟糕混搭。但是会创建一个完整结构化的数组,如上所述可以寻址。

6 个答案:

答案 0 :(得分:4)

PSv5 + 解决方案,使用 PS 通用列表([System.Collections.Generic.List[]]存储实例(松散地说,一个可以有效增长的数组)。

# Your custom type.
class MyRecord {
    [string] $Signature
    [int] $PID
}

# If you want a list that can grow efficiently,
# use [System.Collections.Generic.List[]]
$RecList = [System.Collections.Generic.List[MyRecord]]::new()

# Add a new instance...
$RecList.Add([MyRecord]::new())

# ... and initialize it.
$RecList[0].Signature = 'sig1'
$RecList[0].Pid = 666

# ... or initialize it first, and then add it.
# Note the use of a cast from a hashtable with the property values.
$newRec = [MyRecord] @{ Signature = 'sig2'; PID = 667}
$RecList.Add($newRec)

# Output the list
$RecList

以上产量:

Signature PID
--------- ---
sig1      666
sig2      667

至于从列表中删除对象:

  • 要通过 index 删除,请使用.RemoveAt();超出范围的索引会抛出错误:

    • $RecList.RemoveAt(1)
  • 要通过已存储在列表中的对象删除,请使用.Remove()
    请注意,[bool]返回值表示值是否为 实际上已删除(如果对象不在列表中,则操作为 无操作且返回$False

    • $actuallyRemoved = $RecList.Remove($newRec)

有关详细信息,请参阅the docs

答案 1 :(得分:0)

您想要创建自定义对象。

您创建的对象具有您需要的所有属性。然后创建一个集合,并将新对象的实例填充到集合中。这是一个例子:

$WIP = @()
$o = New-Object –TypeName PSObject
Add-Member -InputObject $o –MemberType NoteProperty –Name signature –Value 'foo'
Add-Member -InputObject $o –MemberType NoteProperty –Name data –Value 'bar'
$WIP += $o

$WIP[0].signature
$WIP[0].data

您需要为您正在创建的每个对象执行New-Object和Add-Member语句。

答案 2 :(得分:0)

所以这里有一个工作示例,说明如何使这样的工作:

 $list=@()
 1..100|foreach-object{
 $obj=""|select signature,pid
 $obj.signature="$_ signature"
 $obj.pid="$_ PID"
 $list+=$obj
}

以这种方式创建对象 - 您可以执行$list[43].signature并且它确实有效。

答案 3 :(得分:0)

您可以使用带有索引的哈希表作为键,并将哈希表用作值。这很容易使用。

$WIP = @{
    0 = @{
        signature = 'signature 0'
        PID = 'PID 0'
    }
    1 = @{
        signature = 'signature 1'
        PID = 'PID 1'
    }
}

您可以添加所需的任何索引。

$WIP[12] = @{
    signature = "signature 12"
    PID = "PID 12"
}

$WIP[12].PID
# PID 12

您可以初始化both,any或none。

$WIP[76] = @{
    signature = "signature 76"
}

$WIP[76].signature
# signature 76
$WIP[76].PID
# $null

Count为您提供“活动”元素的数量。

$WIP.Count
# 4

答案 4 :(得分:0)

“动态”究竟是什么意思?

$array = @(
    # Some type of loop to create multiple items foreach/for/while/dowhile
    foreach ($item in $collection) {
        New-Object psobject -Property @{
            Signature = 'data'
            PID = 'data'
        }
    }
)

或者你可以手动添加这样的对象

$array = @()
# Later in code
$array += New-object psobject @{
    Signature = 'data'
    PID = 'data'
}

然后您可以像这样访问每个项目:

$array[1].Signature
$array[1].PID

答案 5 :(得分:0)

这与你已经展示的内容没有什么区别,但我认为这可以为你提供所要求的东西(即使它不是以强大的方式做事)。

  a        b            
  <chr>    <chr>        
1 var_imp_01 prevalence
2 var_imp_MeanDecreaseGini variance_pairwise_distance
3 var_imp_06 extinction_rate