提问人:Suslik 提问时间:11/17/2023 更新时间:11/17/2023 访问量:26
对长列表的转发声明进行排序并删除所有重复项
Sort long list of forward declarations and delete all duplicates
问:
我有一个巨大的头文件,里面装满了前向声明,我想按字母顺序对它们进行排序,以便更好地概述并删除所有重复项。
该文件大约有 400 行,如下所示:
namespace AnimalClothing
{
class Cat_Gloves;
class Dragon_Hat;
class Ant_Shoes;
class Lion_Glasses;
class Dragon_Hat;
...
}
我找不到使用 ReSpharper 执行此操作的方法,所以我只是将没有命名空间括号的内容复制到 .txt 文件中,并使用 PowerShell 来完成这项工作。
Get-Content forwardDeclarations.txt | ForEach-Object {
$Line = $_.Trim() -Split '\s+'
New-Object -TypeName PSCustomObject -Property @{
ClassKeyword = $Line[0]
ClassName = $Line[1]
}
} | Sort-Object ClassName -Unique > SortedWithoutDuplicate.txt
输出为
ClassName Keyword
--------- -------
Alpaca_Boots; class
Anaconda_Socks; class
Ant_Shoes; class
Ape_Jumper; class
为了再次获得列的正确顺序(类在类名前面),我按 Sort-Object 对其进行排序ClassKeyword
Get-Content SortedWithoutDuplicate.txt | ForEach-Object {
$Line = $_.Trim() -Split '\s+'
New-Object -TypeName PSCustomObject -Property @{
Keyword = $Line[0]
ClassName = $Line[1]
}
} | Sort-Object Keyword > EndResult.txt
最后的结果是我想要的,但它看起来像一个非常复杂的脚本。有谁知道如何以更优雅的方式解决这个问题?
答:
2赞
Mathias R. Jessen
11/17/2023
#1
而不是 ,请使用以下语法(自 PowerShell 3.0 起支持):New-Object -TypeName PSCustomObject ...
[PSCustomObject]@{
ClassKeyword = $Line[0]
ClassName = $Line[1]
}
此特定源代码构造(将哈希表文本强制转换为)将导致 PowerShell 创建一个新的自定义对象,该对象保留源代码中的成员顺序。[PSCustomObject]
作为替代方案,您可以构造一个有序字典并将其传递给(或像上面的示例一样将其转换为),它也会保留插入顺序 - 当对象的“形状”可能是动态的或预先不知道时非常有用:New-Object
[PSCustomObject]
# cast a hashtable literal to `[ordered]` to create an ordered dictionary
$objectProperties = [ordered]@{
Name = "Name Goes Here"
}
# now we can (conditionally) add things to the property table before turning it into an object
if ($shouldAddIdToObject) {
$objectProperties['Id'] = Get-Random
}
# ... and then convert it to an object with the same member order
[PSCustomObject]$objectProperties
# this will work with New-Object as well:
# New-Object PSCustomObject -Property $objectProperties
评论