对长列表的转发声明进行排序并删除所有重复项

Sort long list of forward declarations and delete all duplicates

提问人:Suslik 提问时间:11/17/2023 更新时间:11/17/2023 访问量:26

问:

我有一个巨大的头文件,里面装满了前向声明,我想按字母顺序对它们进行排序,以便更好地概述并删除所有重复项。

该文件大约有 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

最后的结果是我想要的,但它看起来像一个非常复杂的脚本。有谁知道如何以更优雅的方式解决这个问题?

PowerShell 锐化器

评论

0赞 Igor Akhmetov 11/17/2023
看起来 R# 缺少捕获重复正向声明的检查。我已经提交了功能请求

答:

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