【问题标题】:Set (data structure) in PowerShell在 PowerShell 中设置(数据结构)
【发布时间】:2020-06-09 19:56:43
【问题描述】:

有没有办法在 PowerShell 中定义 Set data-structure

在计算机科学中,集合是一种抽象数据类型,可以存储某些值,没有任何特定的顺序,也没有重复的值。它是有限集的数学概念的计算机实现。与大多数其他集合类型不同,通常不是从集合中检索特定元素,而是测试集合中成员的值。

我需要使用一个数据结构作为密钥库:

  • 保证不重复;
  • 最大限度地减少了检索和删除元素的计算工作量。

【问题讨论】:

    标签: powershell set


    【解决方案1】:

    您可以使用位于System.Collections.Generic 下的.NET HashSet 类:

    $set = New-Object System.Collections.Generic.HashSet[int]
    

    集合保证了唯一的项目,AddRemoveContains 方法的平均操作复杂度为 O(1)。

    【讨论】:

      【解决方案2】:

      如果您更喜欢使用原生 PowerShell 类型,可以使用 HashTable 并忽略键值:

      # Initialize the set
      $set = @{}
      
      # Add an item
      $set.Add("foo", $true)
      
      # Or, if you prefer add/update semantics
      $set["foo"] = $true
      
      # Check if item exists
      if ($set.Contains("foo"))
      {
          echo "exists"
      }
      
      # Remove item
      $set.Remove("foo")
      

      欲了解更多信息,请参阅:https://powershellexplained.com/2016-11-06-powershell-hashtable-everything-you-wanted-to-know-about/#removing-and-clearing-keys

      【讨论】:

      • 如果密钥已经存在,至少使用 powershell 核心$set.Add("foo", $true) 会抛出异常。因此应该改用$set["foo"] = $true,因为它不仅可以创建新密钥,还可以更新现有密钥。
      • @K.Frank 这真的取决于您所追求的行为 - 您可能非常希望在某些情况下例外。我承认它与Remove 行为更一致(如果该项目不存在则不会抛出),所以我会将它添加到我的答案中 - 谢谢!
      • 那么 HashTable 和 HashSet 在 PowerShell 中是相似的:没有重复的键?
      • @Timo PowerShell 类型是 .NET 类型。由于它们在 .NET 中在这方面是相似的(没有重复的键),因此这种相似性在 PowerShell 中是相同的:docs.microsoft.com/en-us/dotnet/api/…
      【解决方案3】:

      如果您只想以相对较快的添加、删除和查找操作将唯一值存储在数组中,那么您正在寻找哈希集。它可以被创建为 -

      $set = [System.Collections.Generic.HashSet[int]]@()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 2021-04-06
        相关资源
        最近更新 更多