假设我有一个方法获取我的枚举类型ProjectName
的枚举的集合,并且有一个Server
对象的集合,我想与ProjectName
类型中的那些Project
s相关联;我将如何在Powershell Select-Object
(或其他一些LINQ的Select
)中做到这一点。
我想在Powershell中生成的C#相当于:
var servers = new[]
{
new Server(/*someOtherProjectsCollection goes here*/),
new Server(/*someOtherProjectsCollection goes here*/),
new Server(/*someOtherProjectsCollection goes here*/)
};
var projects = GetProjectNames().Select(projectName => new Project(projectName, servers.Where(server => server.Projects.Any(serverProject => serverProject.Name == projectName))));
但我所拥有的是:
$servers = [Server]::new(/*someOtherProjectsCollection goes here*/), [Server]::new(/*someOtherProjectsCollection goes here*/), [Server]::new(/*someOtherProjectsCollection goes here*/)
$projects = (GetProjectNames()) | Select-Object {
$selectedProjectName = $_
return [Project]::new($_, ($servers | Where-Object { $_.projects.Where({ $_ -eq $selectedProjectName }).Count -gt 0 }))
}
当我尝试在Powershell LSE中读取$projects
时(在最后一行之后的断点处),它只是将代码作为字符串返回,我甚至无法将其转换为[Project[]]
。我认为问题可能是使用Select-Object
的大括号,但我不知道如何在Project
中创建一个新的Select-Object
对象。
你想要ForEach-Object
而不是Select-Object
为每个项目名称返回一个新的[Project]
实例;此外,您的代码可以简化:
$projects = GetProjectNames | ForEach-Object {
$projectName = $_
[Project]::new(
$_,
$servers.Where({ $_.projects -eq $projectName })
)
}
Select-Object
用于根据输入对象中的select属性创建新的自定义对象;相反,您正在从每个输入对象构造一个新的特定类型实例,这必须在ForEach-Object
调用中完成,您可以在其中显式控制输出。$_.projects -eq $projectName
作为条件依赖于PowerShell能够将-eq
与数组一起用作LHS,在这种情况下执行过滤,并返回过滤后的子数组;由于.Where()
将脚本块的输出解释为布尔值,因此空子阵列被解释为$false
,而具有至少一个元素的子阵列被解释为$true
。return
:由于新构造的[Project]
实例未分配给变量或发送到其他地方,因此会自动返回。