Melintasi Struktur dan Tindakan Pohon

Saya telah membangun struktur pohon dan memiliki beberapa masalah yang diselesaikan dalam pertanyaan Melintasi Struktur Pohon

Saya ingin mengimplementasikan metode dengan tindakan di kelas TreeNode. Saya mengalami kesulitan memahami bagaimana melakukan ini dan menerapkannya. Apa yang saya miliki sejauh ini adalah:

            internal void Traverse(Action<TreeNode<T>> action)
            {
                action(TreeNode<T>);
                foreach (var child in this.children)
                    child.Traverse(action);
            }

Penjelasan dan bantuan apa pun akan sangat dihargai.

Saya mendapatkan kesalahan:

Kesalahan 667 TreeNode' adalah 'tipe' tetapi digunakan seperti 'variabel'

Kesalahan 668 'System.Collections.Generic.KeyValuePair>' tidak berisi definisi untuk 'Traverse' dan tidak ada metode ekstensi 'Traverse' yang menerima argumen pertama bertipe 'System.Collections.Generic.KeyValuePair>' yang dapat ditemukan (apakah Anda kehilangan arahan penggunaan atau referensi perakitan?)


person PBrenek    schedule 21.11.2014    source sumber


Jawaban (1)


di baris pertama, Anda harus memasukkan sebuah variabel.
Pada dasarnya, panggil tindakan seperti yang Anda lakukan pada fungsi biasa:

action(myTreeNode)

Kesalahan kedua adalah karena Anda lupa memilih "Nilai" dari kamus.

       internal void Traverse(Action<TreeNode<T>> action)
       {
         action(this);
         foreach (var child in this.children.Values)
           child.Traverse(action);
       }

Saya telah mengimplementasikan fungsi seperti ini sebelumnya, tetapi masalahnya adalah Anda mengunci diri Anda pada satu jenis traversal. Saya sarankan Anda tetap menggunakan foreach, sehingga Anda dapat memodifikasi traversal menggunakan LINQ. Di posting terakhir Anda, Anda menunjukkan bahwa Anda membuat pohon Anda mengimplementasikan IEnumerable. Hanya itu yang Anda perlukan untuk mengaktifkan LINQ.

Jadi, Anda dapat memenuhi kebutuhan Anda saat ini seperti ini:

foreach (var node in MyTree)
{
  // do stuff to node here
{

Dan kedepannya, Anda bisa melakukan hal-hal keren seperti ini:

foreach (var node in MyTree.Where(n => n.Type == somethingOfInterest))
{
  // do stuff to node here
{
person Adam C    schedule 21.11.2014
comment
Terima kasih. Ini berhasil tetapi saya tidak mengerti bagian tindakan (ini). Ya, saya memahami nilai-nilai bagian dari kesalahan kamus. Terima kasih. - person PBrenek; 21.11.2014
comment
Saya berasumsi bahwa Traverse adalah anggota kelas TreeNode‹T›. - person Adam C; 21.11.2014
comment
Terima kasih. Jadi, apakah Anda menyarankan agar saya mengeluarkan metode Traverse dari kelas TreeNode dan menempatkannya di kelas Tree? - person PBrenek; 21.11.2014