gpt4 book ai didi

Powershell,内置的集合交叉点?

转载 作者:行者123 更新时间:2023-12-04 15:05:33 27 4
gpt4 key购买 nike

对于一些需要从一堆松散字母中找到字谜的游戏,我最终实现了一个置换算法来找到所有可能的字谜,并在需要时过滤已知字母位置的那些(顺便说一下,-match 很棒)。但是对于较长的单词,这被证明非常容易出错,因为浏览大量乱码并不能真正揭示隐藏在其中的正确单词。

所以我想,如果我有一个大的英语单词列表(应该可以在某个地方获得),我可以将我的排列列表与正确的单词列表相交,并(希望)从排列列表中获取所有真实的单词。

由于 PS 中的许多运算符对集合的工作方式不同,我想我可以做类似的事情

$wordlist -contains $permlist

并让路口回来。不幸的是,这并不容易。我想到的其他选项是遍历一个列表并执行 -contains对于每个项目:
$permlist | ? { $wordlist -contains $_ }

我认为这可能会起作用,但也很慢(尤其是当 $wordlistgc wordlist.txt 的结果时)。或者我可以构建一个巨大的正则表达式:
$wordlist -matches (($permlist | %{ "^$_`$" }) -join "|")

但这也可能不会很快。我也可以使用 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)

(从 Josh Einstein 借用 New-HashSet)

警告:HashSet 上的那些方法是修改原始集合的就地算法。如果您想对不可变对象(immutable对象)进行函数式转换,则需要将 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))

显然,有人需要将这种静态通用反射废话包装到一个友好的 cmdlet 中!别担心,我正在努力...

关于Powershell,内置的集合交叉点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1152766/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com