การสำรวจโครงสร้างและการกระทำของต้นไม้

ฉันได้สร้างโครงสร้างแบบต้นไม้และมีปัญหาเล็กน้อยซึ่งได้รับการแก้ไขแล้วในคำถาม การสำรวจโครงสร้างต้นไม้

ฉันต้องการใช้วิธีการที่มีการดำเนินการในคลาส TreeNode ฉันมีปัญหาในการทำความเข้าใจวิธีการทำเช่นนี้และนำไปปฏิบัติ สิ่งที่ฉันมีจนถึงตอนนี้คือ:

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

คำอธิบายและความช่วยเหลือใด ๆ จะได้รับการชื่นชมอย่างมาก

ฉันได้รับข้อผิดพลาด:

ข้อผิดพลาด 667 TreeNode' เป็น 'ประเภท' แต่ใช้เหมือน 'ตัวแปร'

ข้อผิดพลาด 668 'System.Collections.Generic.KeyValuePair>' ไม่มีคำจำกัดความสำหรับ 'Traverse' และไม่มีวิธีการขยาย 'Traverse' ที่ยอมรับอาร์กิวเมนต์แรกของประเภท 'System.Collections.Generic.KeyValuePair>' (คุณคือใคร) ไม่มีคำสั่งการใช้หรือการอ้างอิงแอสเซมบลี?)


person PBrenek    schedule 21.11.2014    source แหล่งที่มา


คำตอบ (1)


ในบรรทัดแรก คุณต้องส่งตัวแปร
โดยพื้นฐานแล้ว เรียกใช้การดำเนินการเหมือนกับที่คุณส่งฟังก์ชันปกติ:

action(myTreeNode)

ข้อผิดพลาดประการที่สองคือเนื่องจากคุณลืมเลือก "ค่า" จากพจนานุกรม

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

ฉันเคยใช้ฟังก์ชันแบบนี้มาก่อน แต่ปัญหาคือคุณกำลังล็อกตัวเองให้อยู่ในเส้นทางประเภทหนึ่ง ฉันขอแนะนำให้คุณใช้ foreach แทน เพื่อที่คุณจะได้ปรับเปลี่ยนการข้ามผ่านโดยใช้ LINQ ในโพสต์ล่าสุดของคุณ คุณแสดงให้เห็นว่าคุณได้ทำให้ tree ของคุณใช้ IEnumerable นั่นคือทั้งหมดที่คุณต้องเปิดใช้งาน LINQ

ดังนั้น คุณสามารถบรรลุข้อกำหนดปัจจุบันของคุณได้ดังนี้:

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

และในอนาคต คุณสามารถทำสิ่งดีๆ ได้ดังนี้:

foreach (var node in MyTree.Where(n => n.Type == somethingOfInterest))
{
  // do stuff to node here
{
person Adam C    schedule 21.11.2014
comment
ขอบคุณ ใช้งานได้ แต่ฉันไม่ได้รับส่วนการดำเนินการ (นี้) ใช่ ฉันเข้าใจค่าที่เป็นส่วนหนึ่งของข้อผิดพลาดของพจนานุกรม ขอบคุณ - person PBrenek; 21.11.2014
comment
ฉันคิดว่า Traverse เป็นสมาชิกของคลาส TreeNode‹T› - person Adam C; 21.11.2014
comment
ขอบคุณ คุณกำลังแนะนำให้ฉันนำวิธี Traverse ออกจากคลาส TreeNode และวางไว้ในคลาส Tree หรือไม่? - person PBrenek; 21.11.2014