一个如何在Powershell中将一组对象转换为另一种新类型的对象的集合?

时间:2019-03-19 17:04:56

标签: linq powershell projection

假设我有一个方法来获取我的枚举类型为namespace cv { // ... template<typename _Tp> class Point_ { public: typedef _Tp value_type; //! default constructor Point_(); Point_(_Tp _x, _Tp _y); Point_(const Point_& pt); Point_(Point_&& pt) CV_NOEXCEPT; Point_(const Size_<_Tp>& sz); Point_(const Vec<_Tp, 2>& v); Point_& operator = (const Point_& pt); Point_& operator = (Point_&& pt) CV_NOEXCEPT; //! conversion to another data type template<typename _Tp2> operator Point_<_Tp2>() const; //! conversion to the old-style C structures operator Vec<_Tp, 2>() const; //! dot product _Tp dot(const Point_& pt) const; //! dot product computed in double-precision arithmetics double ddot(const Point_& pt) const; //! cross-product double cross(const Point_& pt) const; //! checks whether the point is inside the specified rectangle bool inside(const Rect_<_Tp>& r) const; _Tp x; //!< x coordinate of the point _Tp y; //!< y coordinate of the point }; typedef Point_<int> Point2i; typedef Point_<int64> Point2l; typedef Point_<float> Point2f; typedef Point_<double> Point2d; typedef Point2i Point; } 的枚举的集合,并且有一个我想要与该类型的那些ProjectName关联的Server对象的集合称为ProjectName;我将如何在Powershell Project(或LINQ Select-Object的其他等效版本)中做到这一点。

我想在Powershell中生成的C#等效代码是这样的:

Select

但是我有这个:

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))));

当我尝试在Powershell LSE中读回$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 })) } 时(最后一行之后是断点),它只是将代码作为字符串返回,我什至无法将其转换为$projects 。我认为问题可能出在[Project[]]上使用了花括号,但我不确定如何在Select-Object内创建新的Project对象。

1 个答案:

答案 0 :(得分:2)

您希望ForEach-Object而不是Select-Object为每个项目名称返回一个新的[Project]实例;另外,您的代码也可以简化:

$projects = GetProjectNames | ForEach-Object {
    $projectName = $_
    [Project]::new(
      $_, 
      $servers.Where({ $_.projects -eq $projectName })
    )
}
  • Select-Object用于基于输入对象的选择属性创建新的自定义对象;相比之下,您正在从每个输入对象构造一个新的特定类型的实例,这必须在ForEach-Object调用中完成,在此您应显式控制输出。

  • $_.projects -eq $projectName作为条件依赖于PowerShell将-eq array 用作LHS的能力,在这种情况下,过滤执行,并返回过滤后的 subarray ;由于.Where()将脚本块的输出解释为 Boolean ,因此将一个空的子数组解释为$false,而将具有至少一个元素的子数组解释为$true

  • 还请注意,鉴于PowerShell的隐式输出行为,您不需要显式的return:因为未将新建的[Project]实例分配给变量或发送到其他地方,它将自动返回。