在powershell中使用二进制比较函数对集合进行排序
有没有办法对提供自定义二进制比较函数的PowerShell集合进行排序? 我正在寻找一种类似于C#的方法,它可以通过delegate实例调用,或者可以提供的Java实例调用 顺便说一句:我的问题仅限于PowerShell v4.0 编辑: 提供一个示例集合:在powershell中使用二进制比较函数对集合进行排序,powershell,powershell-4.0,Powershell,Powershell 4.0,有没有办法对提供自定义二进制比较函数的PowerShell集合进行排序? 我正在寻找一种类似于C#的方法,它可以通过delegate实例调用,或者可以提供的Java实例调用 顺便说一句:我的问题仅限于PowerShell v4.0 编辑: 提供一个示例集合: $coll = @{ "A" = @(); "B" = @("C", "D"); "C" = @("E"); "D" = @(); "E" = @(); "F" = @() } 我的用例需要散列表$coll中的键列
$coll = @{
"A" = @();
"B" = @("C", "D");
"C" = @("E");
"D" = @();
"E" = @();
"F" = @()
}
我的用例需要散列表$coll
中的键列表,但其排序方式是,在另一个键$must\u prefore
之前,$must\u prefore-in$coll[$must\u follower]
中没有键$must\u follow>出现
处理后的预期订单可能如下所示:
$solved = @{
"A" = @();
"E" = @();
"C" = @("E");
"D" = @();
"B" = @("C", "D");
"F" = @()
}
考虑到上面提到的限制,我没有找到任何方法来使用任何排序函数。我假设PowerShell v4中没有使用二进制比较器进行排序的功能
我可以根据需要使用一种不那么花哨的解决方案来排列我的列表,大致如下:
$solved = @{
"A" = @();
"E" = @();
"C" = @("E");
"D" = @();
"B" = @("C", "D");
"F" = @()
}
- 迭代$coll条目
- 迭代条目值中的所有项
- 递归调用上面的检查,这些值的项对应$coll中的值
- 将名称添加到$solved(如果尚未出现)
鉴于上述限制,我没有找到任何方法来使用任何排序功能。我假设PowerShell v4中没有使用二进制比较器进行排序的功能
我可以根据需要使用一种不那么花哨的解决方案来排列我的列表,大致如下:
$solved = @{
"A" = @();
"E" = @();
"C" = @("E");
"D" = @();
"B" = @("C", "D");
"F" = @()
}
- 迭代$coll条目
- 迭代条目值中的所有项
- 递归调用上面的检查,这些值的项对应$coll中的值
- 将名称添加到$solved(如果尚未出现)
您可以使用类似于@{Expression={my_Expression};Ascending=$true}
的计算属性来使用排序对象
cmdlet。看一看例子5和例子6,你能给我们举一个收藏的例子吗?你希望它在什么样的比较中排序?@Theo谢谢。我知道Sort Object
cmdlet,但它不提供将两个对象相互比较的功能。表达式一次只能基于一个对象进行计算,就像为对象指定分数,然后根据该分数对输出进行排序一样。我认为我需要的是,考虑到任何两个对象$a
和$b
,评估$a
必须在$b
之前出现。我已经提供了一个我必须处理的集合的最小示例。在我看来,您必须创建一个新的类型或类,然后为它定义一个CompareTo()方法。查看int的compareto()(1).compareto
。您可以用C#(或其他.net语言)定义类,并使用add-type将其引入。您可以使用排序对象
cmdlet,使用类似于@{Expression={my\u Expression};升序=$true}
的计算属性。看一看例子5和例子6,你能给我们举一个收藏的例子吗?你希望它在什么样的比较中排序?@Theo谢谢。我知道Sort Object
cmdlet,但它不提供将两个对象相互比较的功能。表达式一次只能基于一个对象进行计算,就像为对象指定分数,然后根据该分数对输出进行排序一样。我认为我需要的是,考虑到任何两个对象$a
和$b
,评估$a
必须在$b
之前出现。我已经提供了一个我必须处理的集合的最小示例。在我看来,您必须创建一个新的类型或类,然后为它定义一个CompareTo()方法。查看int的compareto()(1)的重载定义。compareto
。您可以用C#(或其他.net语言)定义该类,并将其与add type一起引入。