Ulangi dan ubah Kamus

Saya mencoba menerapkan solusi untuk masalah yang dijelaskan di http://users.metropolia.fi/~dangm/blog/?p=67. Saya baru mengenal bahasa c#. Saya ingin mengulangi kamus menggunakan enumerator dan untuk kondisi tertentu. Jadi ada dua variabel saat ini dan sebelumnya. Saat ini menunjuk ke elemen pertama kamus. sebelumnya menunjuk ke elemen sebelumnya dalam kamus. Saat mengulangi kamus Saya mengulanginya seperti berikut

previous=current;
current.MoveNext();

Masalahnya adalah ketika kita mengulangi pertama kali melalui seluruh kamus, poin sebelumnya ke elemen terakhir dalam kamus dan poin saat ini ke pasangan nilai kunci acak RawVariable(0,0).Tetapi sekarang ketika kita mengulangi kedua kalinya melalui kamus saya ingin saat ini menunjuk ke elemen pertama di kamus.bagaimana cara saya menunjuk saat ini ke beberapa elemen yang memiliki kunci atau nilai tertentu

Ini cuplikan kode saya

 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 sumber
comment
Pertanyaan Anda saat ini sangat tidak jelas. Kode Anda menggunakan beberapa variabel dan metode yang tidak dijelaskan sama sekali, dan penjelasan teks Anda sulit untuk dipahami. Mohon klarifikasi.   -  person Jon Skeet    schedule 07.03.2013
comment
Coba tebak... tetapkan current ke awal if (ele.Equals(b.Last())?   -  person M.Babcock    schedule 07.03.2013
comment
apakah Anda ingin mencari beberapa nilai di Dictionary   -  person शेखर    schedule 07.03.2013
comment
@Shekhar Tidak. Untuk setiap elemen dalam array B. Saya ingin memeriksa apakah elemen tersebut kurang dari nilai dalam kamus. Jika elemen dalam array B lebih besar dari nilai tertentu dalam kamus, saya menambahkan pasangan nilai kunci itu dalam daftar‹int,int›.Masalah adalah ketika saya mengulangi saya perlu memiliki 2 petunjuk saat ini dan sebelumnya. Sebelumnya mengikuti saat ini. Sekarang ketika saat ini menunjuk ke elemen terakhir dalam kamus. Masalah dijelaskan di users.metropolia.fi/~dangm/blog/?p=67   -  person user2142681    schedule 07.03.2013


Jawaban (3)


Pertanyaan Anda sulit dimengerti. Mungkin ini yang ingin Anda lakukan di awal perulangan Anda?

current = h1.GetEnumerator();
current.MoveNext();
person Brandon    schedule 07.03.2013
comment
saya melakukan current.movenext().Tetapi setelah mengulangi saya ingin current menunjuk ke elemen pertama dalam kamus yang memiliki kunci,nilai sebagai (0,6).Tetapi kita tahu bahwa setelah kita mengulangi kamus,setelah elemen terakhir dalam kamus ketika kita do current.movenext().current akan menunjuk ke variabel mentah. - person user2142681; 07.03.2013

Jika saya memahami pertanyaan Anda dengan benar, Anda tidak dapat melakukannya. Enumerator memberi Anda akses berturut-turut ke koleksi, itulah intinya. Anda tidak bisa tiba-tiba memindahkannya ke elemen tertentu, tanpa melakukan iterasi ke elemen tersebut dari awal.

Selain itu, saya tidak melihat satu pun alasan bagus untuk menggunakan enumerator. Jika Anda memerlukan referensi ke elemen sebelumnya dan saat ini untuk algoritme Anda - Anda harus menyimpan kuncinya, bukan enumeratornya. Saya juga cukup yakin dengan garis-garis ini

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

a) akan memunculkan pengecualian, ketika Anda akan mencapai akhir koleksi b) tidak akan berfungsi seperti yang diharapkan karena Anda menetapkan tipe referensi

person Nikita B    schedule 07.03.2013

Saya tidak yakin saya memahami pertanyaan Anda, tapi mungkin Anda ingin mengubahnya:

                previous = current;

Untuk ini:

                previous.MoveNext();

Dengan begitu 'sebelumnya' akan selalu tertinggal satu langkah di belakang 'saat ini'. Jika Anda menetapkan variabel seperti yang Anda lakukan dalam kode asli, Anda hanya memiliki dua referensi ke objek 'saat ini' yang kemudian bertambah.

person Christoffer    schedule 07.03.2013