C# 在C中,如何通过值而不是引用复制对象#

C# 在C中,如何通过值而不是引用复制对象#,c#,hill-climbing,C#,Hill Climbing,我正在用C#编写一个简单的hillclimber算法,并尝试以下方法: 获取初始解决方案 将解决方案复制到新对象 将算法应用于复制 将初始溶液的obj值与副本的obj值进行比较 如果更好-复制回初始解决方案 我知道这个主题在以前的帖子中已经提到过,并且尝试在那里实现这个建议——使用IClonable类。这就是我尝试过的: 我的解决方案类: class Solution : ICloneable { public Dictionary<Room, List<Patient&g

我正在用C#编写一个简单的hillclimber算法,并尝试以下方法:

获取初始解决方案
将解决方案复制到新对象
将算法应用于复制
将初始溶液的obj值与副本的obj值进行比较
如果更好-复制回初始解决方案

我知道这个主题在以前的帖子中已经提到过,并且尝试在那里实现这个建议——使用IClonable类。这就是我尝试过的:

我的解决方案类:

class Solution : ICloneable
{

    public Dictionary<Room, List<Patient>> solution { get; set; }


    public Solution()
    {
        solution = new Dictionary<Room, List<Patient>>();

    }
    public object Clone()
    {
        return this.MemberwiseClone();
    }
}
类解决方案:iClonable
{
公共字典解决方案{get;set;}
公共解决方案()
{
解决方案=新字典();
}
公共对象克隆()
{
返回此.MemberwiseClone();
}
}
算法:

public static void swap (Solution solution, Output input, Random rand)
    {


        Solution intSoln = new Solution();
        intSoln = (Solution)solution.Clone();

//Moving things around in intSoln here

        Console.WriteLine("new solution = " + objValue(intSoln, input));
        Console.WriteLine("old solution = " + objValue(solution, input));
        if (objValue(intSoln, input) < objValue(solution, input))
        {
            solution = (Solution)intSoln.Clone();
        }
    }
公共静态无效交换(解决方案、输出输入、随机随机随机)
{
Solution intSoln=新的解决方案();
intSoln=(解决方案)Solution.Clone();
//在intSoln这里移动东西
Console.WriteLine(“新解决方案=“+objValue(intSoln,输入));
Console.WriteLine(“旧解决方案=“+objValue(解决方案,输入));
if(objValue(intSoln,输入)

查看新旧解决方案的打印输出,它们总是相同的,这意味着代码仍然通过引用进行复制。我被卡住了,不知道该怎么办。任何帮助都将不胜感激。

您需要对类型解决方案进行深入克隆。因此,实现IClonable接口:

public class Solution : ICloneable
{
  public object Clone()
  {
    // creating a new dictionnary
  }
}

MemberwiseClone
将进行浅层复制,这意味着您将获得一个新实例,其字段与初始对象具有相同的引用

你想做一个深度复制。这是一份更高级别的副本:

public object Clone()
{
    var copy = new Solution();

    foreach (var pair in solution)
        copy.solution.Add(pair.Key, pair.Value);

    return copy;
}
这将复制字典,但其键和值仍将指向相同的实例。因此,您可以使用以下内容执行更深入的复制:

public object Clone()
{
    var copy = new Solution();

    foreach (var pair in solution)
        copy.solution.Add(new Room(pair.Key), pair.Value.ToList());

    return copy;
}
或:

您需要为
Room
Patient
编写一些副本构造函数。希望你能明白这个想法。

你考虑过用克隆代替克隆吗?
public object Clone()
{
    var copy = new Solution();

    foreach (var pair in solution)
        copy.solution.Add(new Room(pair.Key), pair.Value.Select(i => new Patient(i)).ToList());

    return copy;
}