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

です。

関連する問題