2016-07-06 83 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刪除該項目。

相關問題