在powershell中使用二进制比较函数对集合进行排序

在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中的键列

有没有办法对提供自定义二进制比较函数的PowerShell集合进行排序? 我正在寻找一种类似于C#的方法,它可以通过delegate实例调用,或者可以提供的Java实例调用

顺便说一句:我的问题仅限于PowerShell v4.0

编辑: 提供一个示例集合:

$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一起引入。