Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 列表从同一对象复制,属性在两个位置更新_C# - Fatal编程技术网

C# 列表从同一对象复制,属性在两个位置更新

C# 列表从同一对象复制,属性在两个位置更新,c#,C#,我已经读了很多关于C语言中复制/克隆对象的书,我也试着从中学习,但我的情况有点不同 我有一个从数据库返回的问题/答案对列表。我想用它为父对象和子对象创建两个列表。当我这样做时,我对子对象所做的任何更改都会反映在父对象中 我尝试过创建新列表、克隆等多种排列方式,但结果总是一样的 List<QuestionVM> questionlist = productRepository.GetQuestions(); parent.Questions = AddQuestions(true, p

我已经读了很多关于C语言中复制/克隆对象的书,我也试着从中学习,但我的情况有点不同

我有一个从数据库返回的问题/答案对列表。我想用它为父对象和子对象创建两个列表。当我这样做时,我对子对象所做的任何更改都会反映在父对象中

我尝试过创建新列表、克隆等多种排列方式,但结果总是一样的

List<QuestionVM> questionlist = productRepository.GetQuestions();
parent.Questions = AddQuestions(true, parent, questionlist);
child.Questions = AddQuestions(false, child, questionlist);

private List<QuestionVM> AddQuestions(bool parent, Line line, List<QuestionVM> questions)
{
    //shouldn't this create a new object, not just a reference?
    List<QuestionVM> qs = new List<QuestionVM>(questions);

    if (parent)
    {
        return qs.Where(w => w.ShowOnParent).ToList();
    }
    else
    {
        return qs.ToList(); 
    }
}

非常感谢您的帮助。

仅创建列表的副本是不够的,因为旧列表和新列表中的项目仍将引用相同的对象

在创建复制列表时,您可以为您的对象实现InterfaceO或您自己的,并为每个原始对象调用clone:

public class QuestionVM: ICloneable
{
     public Object Clone()
     {
          return new QuestionVM(this.prop1, this.prop2);
     }
}

...

private List<QuestionVM> AddQuestions(bool parent, Line line, List<QuestionVM> questions)
{
...
return qs
    .Where(w => w.ShowOnParent)
    .Select(obj => (VMQuestion)obj.Clone())
    .ToList();
...
}

注意:如果VMQuestion包含其他复杂类型的字段,那么它们也必须提供克隆方法。

如果其他人对此感兴趣。您可以使用automapper创建对象的深度复制。

它确实创建了一个新的列表对象,但该列表中的项目引用了与初始列表中相同的项目。就是这样!非常感谢。您的克隆方法与使用此方法之间是否存在差异:公共对象克隆{返回this.MemberwiseClone;}@jlkmpls是的,您可以使用this.MemberwiseClone;如果VMQ由不可变成员组成。它将比手动实例化更简单。但是,如果成员是更复杂的可变类型,那么您必须使用特定的构造函数来扩充MemberwiseClone或手动创建新副本。如果您使用automapper添加一些代码(确切地说,是一些使其工作的基本说明和一些用于进一步文档的链接),那将是非常棒的。