Joe*_*oey 6 powershell intersection set
对于某些人需要从一堆松散的字母中找到字谜的游戏,我最终实现了一种排列算法,以找到所有可能的字谜,并根据已知字母位置的需要过滤那些(-match顺便说一下,这很棒).但是对于更长的单词,这被证明非常容易出错,因为略读一大堆乱码并不能真正揭示隐藏在其中的正确单词.
所以我想如果我有一个大的英文单词列表(应该可以在某处获得),我可以将我的排列列表与正确的单词列表相交,并获得(希望)来自排列列表的所有真实单词.
由于PS中的许多操作员对集合的工作方式不同,我认为我可以做类似的事情
$wordlist -contains $permlist
Run Code Online (Sandbox Code Playgroud)
然后回到路口.不幸的是,这并不容易.我想到的其他选项是迭代一个列表并-contains为每个项目执行:
$permlist | ? { $wordlist -contains $_ }
Run Code Online (Sandbox Code Playgroud)
这可能会起作用,但也很慢,我认为(尤其是当$wordlista的结果时gc wordlist.txt).或者我可以建立一个巨大的正则表达式:
$wordlist -matches (($permlist | %{ "^$_`$" }) -join "|")
Run Code Online (Sandbox Code Playgroud)
但这也许不会很快.我也许可以使用findstr上面巨大的正则表达式,但这感觉是错的.
有没有我可以使用的内置解决方案,这比我到目前为止的尝试更好?否则我可能会将单词列表放入哈希表并使用迭代-contains方法,该方法应该足够快.
$left = New-HashSet string
$left.Add("foo")
$left.Add("bar")
$right = New-HashSet string
$right.Add("bar")
$right.Add("baz")
$left.IntersectWith($right)
$left.UnionWith($right)
Run Code Online (Sandbox Code Playgroud)
(借用Josh Einstein的 New-HashSet )
警告:HashSet上的那些方法是用于修改原始集合的就地算法.如果你想要对不可变对象进行函数式转换,你需要将LINQ带到聚会上:
add-type system.core
$asqueryable = [system.linq.queryable].getmethods() | ? { $_.name -eq "AsQueryable" } | select -first 1
$asqueryable = $asqueryable.MakeGenericMethod([string])
$leftAsQueryable = $asqueryable.Invoke($null, (,$left))
$intersect = [system.linq.queryable].getmethods() | ? { $_.name -eq "Intersect" } | select -first 1
$intersect = $intersect.MakeGenericMethod([string])
$result = $intersect.Invoke($null, ($leftAsQueryable, $right))
Run Code Online (Sandbox Code Playgroud)
显然,有人需要将这个静态泛型反射废话包装成一个友好的cmdlet!别担心,我正在努力......
| 归档时间: |
|
| 查看次数: |
5712 次 |
| 最近记录: |