วนซ้ำและแก้ไขพจนานุกรม

ฉันกำลังพยายามใช้วิธีแก้ไขปัญหาตามที่อธิบายไว้ใน http://users.metropolia.fi/~dangm/blog/?p=67. ฉันยังใหม่กับภาษา c# ฉันต้องการวนซ้ำผ่านพจนานุกรมโดยใช้ตัวแจงนับและสำหรับเงื่อนไขเฉพาะ ดังนั้นจึงมีตัวแปรสองตัวที่เป็นปัจจุบันและก่อนหน้า ปัจจุบันชี้ไปที่องค์ประกอบแรกของพจนานุกรม ก่อนหน้าชี้ไปยังองค์ประกอบก่อนหน้าในพจนานุกรม ในขณะที่วนซ้ำ พจนานุกรม ฉันกำลังวนซ้ำเหมือนเดิม

previous=current;
current.MoveNext();

ปัญหาคือเมื่อเราวนซ้ำครั้งแรกผ่านจุดก่อนหน้าทั้งพจนานุกรมไปยังองค์ประกอบสุดท้ายในพจนานุกรมและจุดปัจจุบันไปยังคู่คีย์ค่าแบบสุ่ม RawVariable(0,0) แต่ตอนนี้เมื่อเราวนซ้ำครั้งที่สองผ่านพจนานุกรม ฉันต้องการให้ปัจจุบันชี้ไปที่องค์ประกอบแรก ในพจนานุกรม ฉันจะชี้ปัจจุบันไปยังองค์ประกอบบางอย่างที่มีคีย์หรือค่าเฉพาะได้อย่างไร

นี่คือข้อมูลโค้ดของฉัน

 public void falling_disks(int[] A, int[] B)
    {
        Dictionary<int, int> filledDictionary = filldictionary(d1, A);
        //previous stores the previous element in dictionary
        var previous = filledDictionary .GetEnumerator();
        //current stores next element of previous
        var current = filledDictionary .GetEnumerator();
        current.MoveNext();

        //for each incoming element in array B
        foreach (int ele in B)
        {

            //check if the current key is filled in hashtable h1 that is check if it
            //is already added
            if (!checkifthatvalueisfilled(current.Current.Key))
            {
                //if not check if current value is less than or equal to element
                while ((current.Current.Value >= ele))
                {
                    //assign previous to current
                    previous = current;
                    //move current to next position
                    current.MoveNext();
                }
                listofitemstoremove.Add(previous.Current.Key);

            }
            else
            {
                listofitemstoremove.Add(current.Current.Key);
            }

            foreach (int item in listofitemstoremove)
            {
                if (!(h1.ContainsKey(item)))
                    h1.Add(item, true);
            }

        }
        Console.WriteLine(listofitemstoremove.Capacity);
    }

    public bool checkifthatvalueisfilled(int key)
    {
        if (h1.ContainsValue(h1.ContainsKey(key)) == true)
            return true;
        else return false;
    }

}

person user2142681    schedule 07.03.2013    source แหล่งที่มา
comment
ขณะนี้คำถามของคุณ มาก ไม่ชัดเจน รหัสของคุณใช้ตัวแปรและวิธีการหลายอย่างซึ่งไม่ได้อธิบายเลย และคำอธิบายข้อความของคุณนั้นเข้าใจยาก กรุณาชี้แจง.   -  person Jon Skeet    schedule 07.03.2013
comment
เดา... กำหนด current ไปที่จุดเริ่มต้น if (ele.Equals(b.Last())?   -  person M.Babcock    schedule 07.03.2013
comment
คุณต้องการค้นหาค่าบางอย่างใน Dictionary หรือไม่   -  person शेखर    schedule 07.03.2013
comment
@Shekhar ไม่ สำหรับแต่ละองค์ประกอบในอาร์เรย์ B.ฉันต้องการตรวจสอบว่าองค์ประกอบนั้นน้อยกว่าค่าในพจนานุกรมหรือไม่ หากองค์ประกอบในอาร์เรย์ B มากกว่าค่าเฉพาะในพจนานุกรม ฉันกำลังเพิ่มคู่ค่าคีย์นั้นในรายการ‹int,int›.ปัญหา คือตอนที่ฉันกำลังวนซ้ำ ฉันจำเป็นต้องมีพอยน์เตอร์ 2 ตัวเป็นปัจจุบันและก่อนหน้า ก่อนหน้าตามหลังปัจจุบัน ตอนนี้เมื่อชี้ปัจจุบันไปยังองค์ประกอบสุดท้ายในพจนานุกรม ปัญหาอธิบายไว้ใน users.metropolia.fi/~dangm/blog/?p=67   -  person user2142681    schedule 07.03.2013


คำตอบ (3)


คำถามของคุณเข้าใจยาก บางทีนี่อาจเป็นสิ่งที่คุณต้องการทำเมื่อเริ่มต้นวงของคุณ?

current = h1.GetEnumerator();
current.MoveNext();
person Brandon    schedule 07.03.2013
comment
ฉันกำลังทำ current.movenext().แต่หลังจากวนซ้ำ ฉันต้องการให้ปัจจุบันชี้ไปที่องค์ประกอบแรกในพจนานุกรมซึ่งมีคีย์, ค่าเป็น (0,6) แต่เรารู้ว่าเมื่อเราวนซ้ำพจนานุกรม หลังจากองค์ประกอบสุดท้ายในพจนานุกรมเมื่อเรา do current.movenext().current จะชี้ไปที่ตัวแปรดิบ - person user2142681; 07.03.2013

ถ้าฉันเข้าใจคำถามของคุณถูกต้อง คุณจะทำไม่ได้ Enumerator ช่วยให้คุณเข้าถึงคอลเลกชันได้อย่างต่อเนื่อง นั่นคือประเด็นทั้งหมด คุณไม่สามารถย้ายไปยังองค์ประกอบนั้นในทันที โดยไม่ได้วนซ้ำไปยังองค์ประกอบนั้นตั้งแต่ต้น

นอกจากนี้ฉันไม่เห็นเหตุผลที่ดีเพียงข้อเดียวในการใช้ตัวแจงนับ หากคุณต้องการอ้างอิงถึงองค์ประกอบก่อนหน้าและปัจจุบันสำหรับอัลกอริทึมของคุณ คุณควรเก็บคีย์ขององค์ประกอบเหล่านั้น ไม่ใช่ตัวแจงนับ ฉันยังค่อนข้างแน่ใจว่าบรรทัดเหล่านี้

 while ((current.Current.Value >= ele))
            {
                //assign previous to current
                previous = current;
                //move current to next position
                current.MoveNext();
            }

ก) จะส่งข้อยกเว้นเมื่อคุณมาถึงจุดสิ้นสุดของคอลเลกชัน b) จะไม่ทำงานตามที่คาดไว้เนื่องจากคุณกำลังกำหนดประเภทการอ้างอิง

person Nikita B    schedule 07.03.2013

ฉันไม่แน่ใจว่าฉันเข้าใจคำถามของคุณ แต่บางทีคุณอาจต้องการเปลี่ยนสิ่งนี้:

                previous = current;

สำหรับสิ่งนี้:

                previous.MoveNext();

ด้วยวิธีนี้ 'ก่อนหน้า' จะตามหลัง 'ปัจจุบัน' หนึ่งก้าวเสมอ หากคุณกำหนดตัวแปรตามที่คุณทำในโค้ดต้นฉบับ คุณเพียงแค่มีการอ้างอิงสองครั้งไปยังออบเจ็กต์ 'ปัจจุบัน' ซึ่งจะเพิ่มขึ้น

person Christoffer    schedule 07.03.2013