2016-07-06 4 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() 
            ); 

완전한 기능은이 model에서 result하지에서 항목을 제거합니다, 지금

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); 
} 

입니다.