标题: [技术讨论] PowerShell如何将hash表的键值拼在一起? [打印本页]
作者: 小白龙 时间: 2023-12-18 13:55 标题: PowerShell如何将hash表的键值拼在一起?
我想把哈希表中的键和值用&拼在一起, 像下面这样子, 下面的代码可以实现, 但在 &拼接的地方, 如果要拼的文本很长时就有点慢, 有更简洁更高效的方法吗?
name=Divid&age=23- $bodyParams = @{
- name = "Divid"
- age = "23"
- # 下面还有很多
- }
-
- $body = ""
- foreach ($key in $bodyParams.Keys)
- {
- $value = $bodyParams[$key]
- $body += "$key=$value&"
- }
- $body = $body.TrimEnd('&')
复制代码
作者: wanghan519 时间: 2023-12-18 14:34
字符串拼接慢可以用stringbuilder
但问题是,key value应该需要encodeuri吧,而且url好像有长度限制,不会太长应该也不会慢太多的
作者: 小白龙 时间: 2023-12-18 14:41
本帖最后由 小白龙 于 2023-12-18 14:42 编辑
回复 2# wanghan519
感谢提醒, 我是用表单提交, 长度应该可以忽略
怎样用 用stringbuilder 拼接数组字符串?
作者: wanghan519 时间: 2023-12-18 15:16
回复 3# 小白龙
据说:字符串连接时,每次都要重新申请空间,所以第一部分会被复制无数次,所以慢,stringbuilder可以扩展自身的空间,不会重复申请所以快一点,然后搜到下面的代码是用arraylist然后join,应该也是一样的,然后urlencode是为了消除url里的符号比如空格会变成%20,不知算不算画蛇添足- $bodyParams = @{
- name = "Divid"
- age = "23"
- # 下面还有很多
- }
- [System.Collections.ArrayList] $qs_array = @()
- foreach ($qs in $bodyParams.GetEnumerator()) {
- $qs_key = [System.Web.HttpUtility]::UrlEncode($qs.Name)
- $qs_value = [System.Web.HttpUtility]::UrlEncode($qs.Value)
- $qs_array.Add("${qs_key}=${qs_value}") | Out-Null
- }
- $qs_array -join '&'
复制代码
作者: Five66 时间: 2023-12-19 01:35
hash好像不能控制遍历顺序- $bodyParams = @{
- name = "Divid"
- age = "23"
- # 下面还有很多
- }
-
- $body=[System.Text.StringBuilder]::new()
- $bodyParams.Keys.foreach({
- $null=$body.append($_).append('=').append($bodyParams[$_]).append('&')
- })
- $body.tostring(0,$body.length-1)
复制代码
作者: 小白龙 时间: 2023-12-19 03:16
本帖最后由 小白龙 于 2023-12-19 03:17 编辑
回复 5# Five66
感谢大佬分享, 关于顺序可以用下面的方式控制吧
另外, $bodyParams.Keys.foreach 和 foreach 两种方式, 哪个快? 怎样计时- # 创建一个有序哈希表并添加键值对
- $orderedHash = [ordered]@{
- key1 = "value1"
- key2 = "value2"
- key3 = "value3"
- }
-
- # 遍历有序哈希表
- foreach ($entry in $orderedHash.GetEnumerator()) {
- Write-Host "$($entry.Key): $($entry.Value)"
- }
复制代码
作者: 小白龙 时间: 2023-12-19 03:36
回复 4# wanghan519
感谢大佬分享,
"${qs_key}=${qs_value}" 和 "$(qs_key)=$(qs_value)" 有什么区别吗?
作者: wanghan519 时间: 2023-12-19 03:58
回复 7# 小白龙
圆括号里是要执行的代码,花括号里是变量名
"$($x)"应该等于"${x}",但"$(x)"会报错找不到x命令
作者: Five66 时间: 2023-12-23 05:05
回复 6# 小白龙
加上[ordered]就不是hash,是OrderedDictionary了,foreach和#foreach大概都是调用对象的枚举接口,速度都差不多
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |