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,所以问题仍然有效。
您的示例失败的原因是$_和$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)
| 归档时间: |
|
| 查看次数: |
2278 次 |
| 最近记录: |