gpt4 book ai didi

.net - powershell 中哈希表的数组/对象键

转载 作者:行者123 更新时间:2023-12-01 12:47:37 25 4
gpt4 key购买 nike

使用数组键创建散列时,如何生成键来查找散列值。也就是说,不从散列的枚举器中获取它

$a = @{"a" = "1"
"b" = "2"
("c","c1") = "3"}

使用常规数组,似乎不起作用。

$k1 = @("c","c1")
$a.ContainsKey($k1) #false

但是,如果在创建时使用数组对象,这似乎可行。

$k1 = @("c","c1")
$a = @{"a" = "1"
"b" = "2"
$k1 = "3"}
$a.ContainsKey($k1) #true

例如,如果我使用它来生成哈希表:

$a = Get-Eventlog system -newest 100 | Group-Object {$_.EntryType, $_.Source } -AsHashTable

我如何自己生成可用于 key 查找的变量?

最佳答案

下面的修改有帮助吗?它将键变成字符串。

$a = Get-Eventlog system -newest 100 | Group-Object {  
$_.EntryType, $_.Source
} -AsHashTable -AsString

也许你可以试一试。


更新 来回答,解释为什么你不能按照你想要的方式使用数组来散列,但字符串可以。

基本上,您需要了解两件事。

  1. .NET(实际上,真的是 CLR)具有具有值语义 的事物与具有引用语义 的事物的概念。值语义通常用于具有简单值的事物,例如字符串和数字,"xyz" , 和 167 (任意示例)。引用语义用于对象。 当值相同时,具有值语义的事物被认为是相等的具有引用语义的事物是不相等的,除非它们是完全相同的对象(位于内存中的相同地址)。
    一个额外的问题:具有值语义的事物可以用对象表示(这可能涉及到装箱和拆箱,但我只是把它们放在那儿以指导您在未来的探索中——它太多了,无法获得暂时进入)。当对象用于表示具有值语义的事物时,使用的基类(我认为实际上是一个结构)是 System.ValueType , 并比较 System.ValueType 的两项是一种特殊情况:即使两个项目不在同一内存地址,如果两个对象包含相等的值,则认为它们是“相等的”。
    看看下面的例子(比较两个整数和两个数组),它说明了这些事情。查看整数如何“相等”而数组不相等。

    $a = 167; $b = 167; echo $($a.Equals($b)); #prints True<br/>
    $c = @(167,"xyz"); $d = @(167,"xyz"); echo $($c.Equals($d)); #prints False

  2. 任何 .NET(好吧,实际上是 CLR)对象都能够在其上计算哈希代码值,如果您将对象用作哈希键,则该值就是所使用的值。函数 GetHashCode() 将为项目生成哈希码。示例:$a = "xyz"; $a.GetHashCode();

您遇到的情况的解释

关于您的问题,让我们将上面的 1 和 2 放在一起。由于数组具有引用语义,比较两个数组对象就是在两个不同的内存位置比较两个不同的对象,并且它们不相等。此外,这意味着它们的哈希码将不相等

这,使用上面的数组,echo $c.GetHashCode(); echo $d.GetHashCode();产生两个不同哈希码。

然而,具有值语义的东西,比如两个值相同的字符串,实际上会产生相同的哈希码: $e = "xyz"; $f = "xyz"; echo $e.GetHashCode(); echo $f.GetHashCode();

So, hashing by arrays caused you problems because the hash codes generated for the keys were different (unless you used the exact same array, something you correctly observed). But hashing by, say, strings, gets around the problem, because the hash codes are the same.

最后的说明

您不需要知道这些就可以了解上面解释的实质内容,但 CLR 会为您做的一件事(通常)实际上是创建两个值相同的值类型, 当您通过对象表示值类型时,相同的对象(或结构)。所以$a = "xyz"; $b = "xyz";实际上将指向同一个对象,即 $a 与 $b 是同一个对象——它们不仅值相同,而且是相同的。此附加信息不需要与上面的简化信息冲突。

关于.net - powershell 中哈希表的数组/对象键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14449961/

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