Итерация и изменение словаря

Я пытаюсь реализовать решение проблемы, описанной на http://users.metropolia.fi/~dangm/blog/?p=67. Я новичок в языке С#. Я хочу перебирать словарь с помощью перечислителя и для определенного условия. Итак, есть две переменные: текущая и предыдущая. Текущая указывает на первый элемент словаря. Предыдущая указывает на предыдущий элемент в словаре. При повторении словарь, который я повторяю, как foll

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();
            }

а) выдаст исключение, когда вы дойдете до конца коллекции б) не будет работать должным образом, так как вы назначаете ссылочные типы

person Nikita B    schedule 07.03.2013

Я не уверен, что понимаю ваш вопрос, но, возможно, вы хотите изменить это:

                previous = current;

К этому:

                previous.MoveNext();

Таким образом, «предыдущее» всегда будет на шаг позади «текущего». Если вы назначаете переменные так же, как в исходном коде, у вас есть только две ссылки на «текущий» объект, который затем увеличивается.

person Christoffer    schedule 07.03.2013