.net - 深度复制PSObject

标签 .net powershell deep-copy psobject

我有一个Powershell脚本,在其中执行以下操作

$somePSObjectHashtables = New-Object Hashtable[] $somePSObject.Length;
$somePSObjects = Import-CSV $csvPath
0..($somePSObject.Length - 1) | ForEach-Object {
    $i = $_;
    $somePSObjectHashtables[$i] = @{};
    $somePSObject[$_].PSObject.Properties | ForEach-Object {
        $somePSObjectHashtables[$i][$_.Name] = $_.Value;
    }
}

我需要这样做,因为我想在CSV中制作数据的多个不同副本以执行多个不同的操作。从某种意义上说,我正在对生成的PSObject数组执行“INNER JOIN”。我可以轻松地用ForEach-Object遍历$somePSObjectHashtables并在数组的每个成员上调用Hashtable.Clone()。然后,我可以使用New-Object PSObject -Property $someHashTable[$i]获得PSObject的深拷贝。

我的问题是,没有中间的Hashtable,有没有更简单的方法来制作深拷贝?

最佳答案

为了获得真正的深拷贝,我们可以使用二进制序列化(假设所有数据都是可序列化的;对于来自CSV的数据,绝对是这种情况):

# Get original data
$data = Import-Csv ...

# Serialize and Deserialize data using BinaryFormatter
$ms = New-Object System.IO.MemoryStream
$bf = New-Object System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
$bf.Serialize($ms, $data)
$ms.Position = 0
$data2 = $bf.Deserialize($ms)
$ms.Close()

# Use deep copied data
$data2

关于.net - 深度复制PSObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9204829/

相关文章:

c# - 如何在 C# 中检查一个数组的一个元素是否匹配或另一个数组的元素的一部分?

powershell - 如何在PowerShell中使用可执行脚本 block 和ApartmentState参数设置线程?

powershell - 使用PowerShell剥离数据

scripting - 是否可以将Powershell配置文件代码设置为在每个脚本之后运行?

c++ - 将一个对象数据复制到另一个相同类型的对象c++

java - 如何在 Java 中制作 InputStream 的深拷贝

python - Networkx 复制说明

c# - 将图像从 Url 异步加载到 PictureBox

c# - 使用默认属性的 DataContractSerializer

c# - 无定义或扩展方法 - ISupportInitialize