使用另一个列表 PowerShell 过滤列表

sir*_*Vir 3 .net c# linq powershell

来自 C# 背景并且是一个完全的 PowerShell 新手,我试图基于两个列表/数组进行简单的过滤。

目标:基于列表“filter”过滤列表“toFilter”的元素,因此仅保留“toFilter”的元素,这些元素至少与“filter”中列出的模式之一匹配。

理想情况下,我想使用管道或 Linq (而不是嵌套循环)来实现这一点。

在 C# 中,我会这样做:

string[] filter  = {"A", "B", "C"};
string[] toFilter = {"AA", "AB", "DD"};

var filtered = toFilter.Where(s1 => filter.Any(s2 => s1.Contains(s2))).ToList();
Run Code Online (Sandbox Code Playgroud)

甚至更短,使用方法组:

var filtered = toFilter.Where(s1 => filter.Any(s1.Contains)).ToList();
Run Code Online (Sandbox Code Playgroud)

预期结果:

AA AB
Run Code Online (Sandbox Code Playgroud)

对于 Powershell,我发现一篇文章描述了 C# 中 Linq 的 powershell 等效项,但显然我无法掌握语法。

我提出了以下解决方案:

$filter = @("A", "B", "C")
$toFilter = @("AA", "AB", "DD")

$filtered = $toFilter | where {[Linq.Enumerable]::Any([string[]]$filter, [Func[string,bool]]{ $_ -match $args[0] })}
Run Code Online (Sandbox Code Playgroud)

但它会导致一个空列表。

使用这两个数组来获得预期结果的正确方法是什么?

编辑:显然我的解决方案有效,但它不是纯粹的 LINQ,所以问题仍然有效。

Mat*_*sen 5

您的示例失败的原因是$_$args[0]在内部委托中引用了相同的内容。

不过,这里不需要使用 LINQ - 您可以使用嵌套Where-Object子句执行相同的操作:

$filter = @("A", "B", "C")
$toFilter = @("AA", "AB", "DD")

$filtered = $toFilter | Where-Object {
    $item = $_
    @($filter |Where-Object {$item.Contains($_)}).Count -gt 0
}
Run Code Online (Sandbox Code Playgroud)