2012-09-27 53 views
-1

我有一個列表originalDailyDetailReport,我需要克隆。其中的數據將在應用程序中更改,但是當我打印最終報告時,我確實需要原始數據。我需要克隆一個列表

我雖然這一點的代碼應該做的伎倆,但最後,我只用來打印報告的我的duplicateDailyDetailReport列表已更改。

任何想法?

public DailyDetailReports SaveOriginalDailyDetailReportData(DailyDetailReports originalDailyDetailReport) 
      { 
       DailyDetailReports duplicateDailyDetailReport = new DailyDetailReports(); 

       try 
       { 
        duplicateDailyDetailReport.Rec.AddRange(
originalDailyDetailReport.Rec.ConvertAll<Receivables>(rec => rec)); 

    duplicateDailyDetailReport.Dil.AddRange(
originalDailyDetailReport.Dil.ConvertAll<Dilution>(dil=> dil)); 

    duplicateDailyDetailReport.Acc.AddRange(
originalDailyDetailReport.Acc.ConvertAll<Accountable>(acc => acc)); 
           duplicateDailyDetailReport.Out.AddRange(
originalDailyDetailReport.Out.ConvertAll<Outstanding>(o => o)); 
           } 
           catch (Exception ex) 
           { 
            MessageBox.Show(ex.Message); 
           } 

           return duplicateDailyDetailReport ; 
          } 

回答

0

我自己做的。我用反射。

這是代碼。好或壞,它的工作原理。

public static DailyDetailReports CloneLists(DailyDetailReports listToClone) 
     { 
      DailyDetailReports clonedList = new DailyDetailReports(); 

      clonedList.Rec.AddRange(PerformTheCloning(listToClone.Rec)); 
      clonedList.Dil.AddRange(PerformTheCloning(listToClone.Dil)); 
      clonedList.Acc.AddRange(PerformTheCloning(listToClone.Acc)); 
      clonedList.Out.AddRange(PerformTheCloning(listToClone.Out)); 

      return clonedList; 
     } 

    public static List<T> ListCloning<T>(List<T> listToClone) 
      { 
       PropertyInfo[] listToCloneProperties = listToClone.GetType().GetGenericArguments().First().GetProperties(); 

       try 
       { 
        List<T> clonedList = new List<T>(); 

        foreach (object t in (IEnumerable<object>)listToClone) 
        { 
         object clonedListRecord = Activator.CreateInstance(typeof(T), null); 

         foreach (PropertyInfo t1 in listToCloneProperties) 
         { 
          PropertyInfo clonedListProperty = 
           clonedListRecord.GetType().GetProperties().FirstOrDefault(record=> record.Name == t1.Name); 

          if (clonedListProperty != null) 
           clonedListProperty.SetValue(clonedListRecord, t1.GetValue(t, null), null); 
         } 

         clonedList.Add((T)clonedListRecord); 
        } 

        return clonedList; 
       } 
       catch (Exception ex) 
       { 
        MessageBox.Show(ex.Message); 
       } 

       return null; 
      } 
1

您可以嘗試以下操作,克隆每個項目並創建一個新列表。

var newList = yourlist.Select(r => r.Clone()).ToList(); 
0

您需要通過原始列表循環,使每個元素副本(它的一個副本的情況下,不只是參考複製),並添加進副本新的列表。

0

列表由對各個對象的引用而不是實際對象組成。當您複製列表時,將創建一個新列表,該列表引用與舊的列表相同的對象。您必須逐字段地深入複製對象並將其推入列表中。