热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用数组将Hashtable排序为值

如何解决《使用数组将Hashtable排序为值》经验,为你挑选了1个好方法。

描述:我正在构建一个PowerShell脚本来搜索文件,然后给它们唯一的名称,复制它们然后通过哈希计算验证它们 - 我选择在每个步骤的函数中拆分脚本,因此更容易维护整件事情.为了从一个函数到另一个函数获取所有值,我选择使用[hashtable]$FooBar- inside $FooBar,有多个数组,例如FullNameOutputPath(可能会更改每个文件,因为它们将被复制到命名的子文件夹yyyy-mm-dd).所有数组都相互关联(意味着索引1包含第一个文件的所有值,索引2包含第二个文件的值,...),这在现在工作正常.

简化可视化:

$FooBar = @{}
$FooBar.FullName = @()
$FooBar.Size = @()
$FooBar.Ext = @()
Get-ChildItem | ForEach-Object {
    $FooBar.FullName += $_.FullName
    $FooBar.Size += $_.Length
    $FooBar.Ext += $_.Extension
}

但是,我现在需要通过其中一个数组的一个值集对它们进行排序,例如大小.或者,再次可视化:

# From:
$FooBar
Name                           Value
----                           -----
fullname                       {D:\AAA.XYZ, D:\BBB.ZYX, D:\CCC.YZX}
size                           {222, 111, 555}
extension                      {.XYZ, .ZYX, .YZX}

# To:
$FooBar = $FooBar | Sort-Object -Property Size -Descending
$FooBar
Name                           Value
----                           -----
fullname                       {D:\CCC.YZX, D:\AAA.XYZ, D:\BBB.ZYX}
size                           {555, 222, 111}
extension                      {.YZX, .XYZ, .ZYX}

我试过了$FooBar.GetEnumerator() | Sort-Object -Property Size,但这并没有改变任何事情.Google提出了如何对一组哈希表进行排序的建议,但在我的情况下,反之亦然,我无法理解这一点,因为我甚至不理解为什么这是一个问题.

所以我的问题是:有没有办法通过其中一个数组的值集对哈希表中的所有数组进行排序?我无法理解这一点.

免责声明:我是一个PowerShell-autodidact,在脚本/编程方面没有合理的背景,所以很可能我的"将所有东西都包含在一个散列表中"-solution根本不起作用或者效率极低 - 如果是这样的话, 请告诉我.



1> Patrick Mein..:

我认为你想要做的最简单的方法是 Select-Object

$fooBar = Get-ChildItem | Select-Object FullName, Size, Extension

这将创建一个只具有所需属性的新对象数组.这种方法起作用的原因并不是因为Sort-Object适用于属性,而您指定的属性位于几个层之后.

如果您需要比精确属性更多的灵活性,您可以像这样创建自己的灵活性

$fooBar = Get-ChildItem | Select-Object @{Name = 'SizeMB'; Expression = {$_.Size / 1MB}}

或者使用[PSCustomObject]类型加速器手动创建新属性:

$fooBar = Get-ChildItem | ForEach-Object {
    [PSCustomObject]@{
        FullName = $_.FullName
        Extension = $_.Extension
        Size = $_.Size
    }
}

更新

如果您需要在最初创建对象后向对象添加其他属性,则可以选择一些选项.

加入会员

到目前为止,最常用的方法是使用Add-Membercmdlet.

$object | Add-Member -MemberType NoteProperty -Name NewProperty -Value 'MyValue'

$object

要记住的重要一点是,默认情况下,此cmdlet不会返回任何内容.因此,如果将上述语句放在函数的末尾并且不单独返回该对象,则函数将不返回任何内容.确保您使用-PassThru参数(这对链接Add-Member命令也很有用)或之后调用变量(如上例所示)

选择-对象

使用计算属性添加成员时,可以选择所有以前的属性.请记住,由于Select-Object工作方式的原因,源对象中的所有方法都不会被转移.

$fooBar | Select-Object *, @{Name = 'NewProperty'; Expression = {'MyValue'}}
psobject.Properties

这个是我个人最喜欢的,但它仅限于PowerShell的更高版本,我还没有看到它被其他任何人使用过.

$fooBar.psobject.Properties.Add([psnoteproperty]::new('NewProperty', 'MyValue'))
$fooBar

每个成员类型都有自己的构造函数.您还可以添加方法$fooBar.psobject.Methods或键入到$fooBar.psobject.Members.我喜欢这种方法,因为它感觉更明确,而且添加成员与成员的感觉是正确的.

摘要

您选择的方法主要是偏好.Add-Member如果可能,我会建议,因为它是最常用的,因此具有更好的可读性和更多可以回答有关它的问题的人.

我还想提一下,如果可能的话,通常最好避免添加额外的成员.理想情况下,函数的返回值应具有可靠的形式.如果有人正在使用您的函数,并且他们必须猜测对象上何时存在属性或方法,则调试变得非常困难.显然这不是一个硬性规则,但如果你需要添加一个成员,你至少应该考虑改造是否更好.


推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了Composer依赖管理的重要性及使用方法。对于现代语言而言,包管理器是标配,而Composer作为PHP的包管理器,解决了PEAR的问题,并且使用简单,方便提交自己的包。文章还提到了使用Composer能够避免各种include的问题,避免命名空间冲突,并且能够方便地安装升级扩展包。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了在Win10上安装WinPythonHadoop的详细步骤,包括安装Python环境、安装JDK8、安装pyspark、安装Hadoop和Spark、设置环境变量、下载winutils.exe等。同时提醒注意Hadoop版本与pyspark版本的一致性,并建议重启电脑以确保安装成功。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
author-avatar
mobiledu2502901087
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有