假设我有一个方法来获取我的枚举类型为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
对象。
答案 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]
实例分配给变量或发送到其他地方,它将自动返回。