2016-07-06 82 views
0

我搜索了很多,我知道这个问题已被问了很多次,但没有找到适合我的问题的解决方案。复制自定义列表对象到另一个列表对象

我有一类具有下列结构

namespace Website.Models 
{ 
    public class DynamicControlModel 
    { 
    } 

    public class QuestionnairModel 
    { 
     public long QuestionId { get; set; } 
     public string Question { get; set; } 
     public List<QuestionnairOptionModel> QuestionnairOption { get; set; } 
    } 

    public class QuestionnairOptionModel 
    { 
     public long OptionId { get; set; } 
     public string OptionString { get; set; } 
     public bool OptionControl1 { get; set; } 
     public string OptionControl2 { get; set; } 
    } 
} 

,我尝试这样做:

public ActionResult ProcessRequest(List<QuestionnairModel> model) 
{ 
    List<QuestionnairModel> result = new List<QuestionnairModel>(model); 
    result = result.Where(x => x.QuestionnairOption.Any(l => l.OptionControl1 == true)).ToList(); 
    result.ForEach(x => x.QuestionnairOption.RemoveAll(m => m.OptionControl1 == false)); 
    return View(@"~\Views\Home\About.cshtml", model); 
} 

问题在这里是当我删除结果对象项目它会从模型中移除,以及。我希望模型对象不会因结果对象中的任何更改而受到影响。

我知道类是默认传递引用,这就是为什么它从两个对象中删除。

让我知道如何让它通过值可能解决问题。

+1

http://stackoverflow.com/questions/78536/deep-cloning-objects –

回答

0

感谢@大卫皮尔金顿

我一直在使用下面的代码解决了我的问题。

 

    public static class ObjectCopier 
    { 
     /// 
     /// Perform a deep Copy of the object. 
     /// 
     /// The type of object being copied. 
     /// The object instance to copy. 
     /// The copied object. 
     public static T Clone(T source) 
     { 
      if (!typeof(T).IsSerializable) 
      { 
       throw new ArgumentException("The type must be serializable.", "source"); 
      } 

      // Don't serialize a null object, simply return the default for that object 
      if (Object.ReferenceEquals(source, null)) 
      { 
       return default(T); 
      } 

      IFormatter formatter = new BinaryFormatter(); 
      Stream stream = new MemoryStream(); 
      using (stream) 
      { 
       formatter.Serialize(stream, source); 
       stream.Seek(0, SeekOrigin.Begin); 
       return (T)formatter.Deserialize(stream); 
      } 
     } 
    } 

我在现有代码中做的唯一更改就是将[Serializable]属性添加到我的类中,如下所示。

 

    [Serializable] 
    public class QuestionnairModel 
    { 
     public long QuestionId { get; set; } 
     public string Question { get; set; } 
     public List QuestionnairOption { get; set; } 
    } 

    [Serializable] 
    public class QuestionnairOptionModel 
    { 
     public long OptionId { get; set; } 
     public string OptionString { get; set; } 
     public bool OptionControl1 { get; set; } 
     public string OptionControl2 { get; set; } 
    } 

0

该列表被遍历为引用类型。

您需要再次创建

List<QuestionnairModel> result = new List<QuestionnairModel>(
            model.Select(m => new QuestionnairModel() 
             { 
              Question = m.Question, 
              QuestionId = m.QuestionId, 
              QuestionnairOption = new List<QuestionnairOptionModel>(
                m.QuestionnairOption.Select(n => new QuestionnairOptionModel() 
                { 
                 OptionId = n.OptionId, 
                 OptionString = n.OptionString, 
                 OptionControl1 = n.OptionControl1, 
                 OptionControl2 = n.OptionControl2 
                }).ToList() 
               ) 
             }).ToList() 
            ); 

完整功能是

public ActionResult ProcessRequest(List<QuestionnairModel> model) 
{ 

    List<QuestionnairModel> result = new List<QuestionnairModel>(
             model.Select(m => new QuestionnairModel() 
              { 
               Question = m.Question, 
               QuestionId = m.QuestionId, 
               QuestionnairOption = new List<QuestionnairOptionModel>(
                 m.QuestionnairOption.Select(n => new QuestionnairOptionModel() 
                 { 
                  OptionId = n.OptionId, 
                  OptionString = n.OptionString, 
                  OptionControl1 = n.OptionControl1, 
                  OptionControl2 = n.OptionControl2 
                 }).ToList() 
                ) 
              }).ToList() 
             ); 



    result = result.Where(x => x.QuestionnairOption.Any(l => l.OptionControl1 == true)).ToList(); 
    result.ForEach(x => x.QuestionnairOption.RemoveAll(m => m.OptionControl1 == false)); 
    return View(@"~\Views\Home\About.cshtml", model); 
} 

现在,它将从result没有从model删除该项目。

相关问题