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

4 に答える 4

1

次のことを試して、各アイテムを複製し、新しいリストを作成してください。

var newList = yourlist.Select(r => r.Clone()).ToList();
于 2012-09-27T12:37:42.370 に答える
0

リストは、実際のオブジェクトではなく、個々のオブジェクトへの参照で構成されています。リストをコピーすると、古いリストと同じオブジェクトを参照する新しいリストが作成されます。オブジェクトをフィールドごとにディープ コピーし、それらをリストにプッシュする必要があります。

于 2012-09-27T13:12:30.370 に答える
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;
            }
于 2012-09-28T16:21:54.923 に答える
0

元のリストをループし、各要素のコピー (参照のコピーだけでなく、そのインスタンスのコピー) を作成し、そのコピーを新しいリストに追加する必要があります。

于 2012-09-27T12:39:12.777 に答える