Głębokie kopiowanie listy złożonej

0

Witam,
Mam problem z którym walczę od jakiegoś czasu i nie mogę sobie z nim poradzić.
Mój program to aplikacja okienkowa Windows Forms Application, schemat mojego kodu:

 
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Windows.Forms;

namespace toto
{
    public partial class Form1 : Form
    {
    List<List<int>> Lista_ukryta;
    List<List<int>> Lista_jawna;
public Form1() 
        {
            InitializeComponent();
            Lista_ukryta = new List<List<int>>();
            Lista_jawna = new List<List<int>>();
        }
//tutaj deklaracje wyjatkow, funkcje przyciskow, funkcja wczytywania danych do Lista_ukryta
public void ALGORYTM(List<List<int>> Lista_ukryta, List<List<int>> Lista_jawna)
{
//tutaj potrzebne kopiowanie głębokie ;/
}
private void button1_Click(object sender, EventArgs e)
        {
            ALGORYTM(Lista_ukryta, Lista_jawna);
        }

}

Potrzebuję aby cała lista list czyli Lista_ukryta była skopiowana do innej listy list np. do struktury Lista_Jawna. Oczywiście kopiowanie forem będzie kopiowaniem płytkim i modyfikacja jednej listy zmodyfikuje też drugą bo referencja do pamięci jest jedna i ta sama, a tego chciałbym właśnie uniknąć...
Czytałem i walczę z ICloneable - implementacją interfejsu, ale bez skutku. Chciałbym implementować dalej algorytm a jestem w szachu bo potrzebuję co najmniej dwóch niezależnych pamięciowo struktur danych. Serdecznie proszę o wskazówki.

0

Tak byłem na tej stronie wiele razy... I na paru innych też.
Każda odpowiedź inna a podobno wszystkie dobre, nie wiem gdzie mam co implementować :0

0

Wybierz rozwiązanie, które ciebie najbardziej przekonuje. Mnie to rozwiązanie z linku np. przekonuje.

0

ok spoko tylko, że ja nie rozumiem jak mam to umieścić w swoim kodzie, na razie mam
'does not implement interface member 'System.ICloneable.Clone()'

0

Rozumiem, że deklarujesz,że twoja klasa implementuje interfejs ICloneable, ale nie zawarłeś implementacji metody Clone przez co otrzymujesz taki błąd jak podałeś.

To tylko domysły, bo nie podałeś żadnych informacji co zrobiłeś z tym

0

tak, sęk w tym, że nie wiem jak zaimplementować metodę Clone(), tak aby wykonywała głębokie kopiowanie mojej listy

2

Jeżeli chcesz tylko do typów prostych to trzeba to nie potrzebujesz tego klonować. Wystarczy, że skopiujesz elementy listy.
Elementami listy są listy więc:

var lists = new List<List<int>>();
//tutaj jakieś elementy dodane
var copy = new List<List<int>>();
foreach (var list in lists)
{
   copy.Add(new List<int>(list));
}

To jest bardzo prosty i mam nadzieję zrozumiały przykład jak można to zrobić.

2

Clone lubi kopac w przyszlosci, liste prymitywow (jak to brzmi ;) mozesz prosto skopiowac np za pomoca linq:

 var lista1 = new List<List<int>>();
// tu dodajemy elementy do listy
var lista2 = lista1.Select(lst=>lst.ToList()).ToList();
0

Oba powyższe rozwiązania działają świetnie!
Object.ReferenceEquals()
zwraca false czyli nie ma odniesienia do tego samego miejsca w pamięci o to właśnie mi chodziło
Przestrasznie dziękuję za pomoc!

1 użytkowników online, w tym zalogowanych: 0, gości: 1