Machen Sie eine tiefe Kopie eines Objekts in C# mit privaten Readonly -Variablen und -objektenC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Machen Sie eine tiefe Kopie eines Objekts in C# mit privaten Readonly -Variablen und -objekten

Post by Anonymous »

Dies ist eine Follow -up -Frage zu meinem vorherigen. Erstellen Sie eine tiefe Kopie eines Objekts in einem gleichzeitigen Dokument in C#. Ich möchte mein Patient Objekt so klonen, dass das Objekt patientCovariate für die Kopie gleich ist. Ich möchte das zufällige Crn zu demselben Objekt regenerieren, das erstellt wurde, wenn der Patient strukturiert wurde, indem _SEED . , Ich möchte So halten Sie CRN readonly und _seed privat und readonly . Ist das möglich? < /P>

Code: Select all

using System.Collections.Concurrent;
using System.Text.Json;
namespace ExampleCode;
internal class Program
{
private static void Main(string[] args)
{
Exampel obj = new();
obj.DoStuff();
}
}

internal class Exampel()
{
/// 
/// For the baseline patients (patient ID, patient object), same for all arms and only generated once
/// 
private ConcurrentDictionary _baselinePatients = new();

/// 
/// Patients in the current arm (patient ID, patient object)
/// 
private ConcurrentDictionary _patientsCurrentArm = new();

public void DoStuff()
{
const int EXAMPLE_CYCLE = 0;
// Set the number of arms and treatments
int _nArms = 2;
int _nPatients = 5;

// Add patients at baseline to _baselinePatients
for (int i = 0; i < _nPatients; i++) {
Patient patient = new Patient(1);
patient.PatientCovariates.Add(0, new());
_baselinePatients.TryAdd(i, patient);
}

// Try to copy the patients created in the baseline ConcurrentDictionary
for (int i = 0; i < _nArms; i++) {
for (int j = 0; j < _nPatients; j++) {
Patient patObjCopy = (Patient)_baselinePatients[j].Clone();
Patient patObjCopyTwo = (Patient)patObjCopy.Clone();
patObjCopy.PatientCovariates[EXAMPLE_CYCLE].Add("Covariate for patient ",    // To mark the arm name and make the patient struct different
j.ToString() +
" in arm " +
i.ToString());

// Save the patient copy in the _patientsCurrentArm WITHOUT changing the patient in _baselinePatients
_patientsCurrentArm.TryAdd(j, patObjCopy);
}
}
}

internal struct Patient : ICloneable
{
private readonly int _seed; // used when the object is copied to regenerated the Crn
public readonly  Random Crn { get; }

/// 
/// Cycle, covariate name, covariate value
/// 
public Dictionary PatientCovariates
{ get; set; }

/// 
/// Initiates PatientCovariates
/// 
public Patient(int seed)
{
_seed = seed;
Crn = new(_seed);
PatientCovariates = new();
}

/// 
/// Clone patients
/// 
/// 
public readonly object Clone()
{
Patient patient = new() {
// Here, I also want to regenerate the Crn by using _seed, as was done when the patient was constructed

PatientCovariates = this.PatientCovariates.ToDictionary(
entry => entry.Key,
entry => entry.Value.ToDictionary(
innerEntry => innerEntry.Key,
innerEntry => innerEntry.Value
)
)
};
return patient;
}
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post