Как правильно установить значение словаря, являющегося ссылочным типом, равным нулю? - PullRequest
0 голосов
/ 28 апреля 2020

Предположим, у нас есть класс, подобный приведенному ниже: -

        class DoubleLinkedListNode
        {
            public int Value { get; set; }

            public DoubleLinkedListNode(int value)
            {
                Value = value;
            }

            public DoubleLinkedListNode next = null;

            public DoubleLinkedListNode prev = null;
        }

И затем мы создаем словарь, как указано ниже: -

IDictionary<int, DoubleLinkedListNode> dict = new Dictionary<int, DoubleLinkedListNode>();

key словаря будет содержать Value из DoubleLinkedListNode, который он содержит следующим образом: -

DoubleLinkedListNode newNode = new DoubleLinkedListNode(value);
dict.Add(newNode.Value, newNode );

Давайте также создадим функцию, которая принимает тип значения словаря в качестве входного, и мы делаем это значение null внутри тела функции, как показано ниже: -

private void RemoveNode(DoubleLinkedListNode nodeToBeRemoved)
{
     if(nodeToBeRemoved != null)
     {
         //Do Something

         nodeToBeRemoved = null;
     }

}

, и мы вызываем функцию следующим образом: -

RemoveNode(dict[someValue]);

Давайте создадим другую функцию, в которой мы сделаем значение null явно, как показано ниже: -

    private void RemoveNodeAnother(DoubleLinkedListNode nodeToBeRemoved)
    {
         if(nodeToBeRemoved != null)
         {
             //Do Something
             dict[nodeToBeRemoved.Value] = null;
         }

    }

И затем мы вызываем функцию следующим образом: -

RemoveNodeAnother(dict[someValue]);

В чем разница между двумя вышеупомянутыми функциями?

Почему я спрашиваю, это то, что я делал этот вопрос на Leetcode. Решение, которое я написал, состоит в следующем: -

public class FirstUnique 
{
    private class DoubleLinkedListNode
    {
        public int Value { get; set; }

        public DoubleLinkedListNode(int value)
        {
            Value = value;
        }

        public DoubleLinkedListNode next = null;

        public DoubleLinkedListNode prev = null;
    }

    DoubleLinkedListNode dummyHeadNode = new DoubleLinkedListNode(-1);

    DoubleLinkedListNode dummyTailNode = new DoubleLinkedListNode(-1);

    IDictionary<int, DoubleLinkedListNode> dict = new Dictionary<int, DoubleLinkedListNode>();

    public FirstUnique(int[] nums) 
    {
        InitialiseDummyHeadAndTailNodes();

        foreach(int i in nums)
        {
            Add(i);
        }
    }

    public int ShowFirstUnique() 
    {
        return dummyHeadNode.next.Value;
    }

    public void Add(int value)
    {
        if (dict.ContainsKey(value))
        {
            RemoveNode(dict[value]);
        }
        else
        {
            DoubleLinkedListNode newNode = new DoubleLinkedListNode(value);

            AddNode(newNode);

        }
    }

    private void InitialiseDummyHeadAndTailNodes()
    {
        dummyHeadNode.next = dummyTailNode;
        dummyTailNode.prev = dummyHeadNode;
    }

    private void RemoveNode(DoubleLinkedListNode nodeToBeRemoved)
    {
        if(nodeToBeRemoved != null)
        {
            nodeToBeRemoved.prev.next = nodeToBeRemoved.next;
            nodeToBeRemoved.next.prev = nodeToBeRemoved.prev;

            // If I write nodeToBeRemoved = null, the solution won't pass.
            // But if I write dict[nodeToBeRemoved.Value] = null, the solution is accepted.

            dict[nodeToBeRemoved.Value] = null;
        }

    }

    private void AddNode(DoubleLinkedListNode nodeToBeAdded)
    {
        //Update the pointers.
        nodeToBeAdded.prev = dummyTailNode.prev;
        nodeToBeAdded.prev.next = nodeToBeAdded;
        nodeToBeAdded.next = dummyTailNode;
        dummyTailNode.prev = nodeToBeAdded;

        //Add the node to the dictionary.
        dict.Add(nodeToBeAdded.Value, nodeToBeAdded);
    }
}

Я сделал комментарии, где лежит аномалия. В чем может быть причина такого поведения?

1 Ответ

2 голосов
/ 28 апреля 2020

Есть только один способ "установить значение словаря в ноль" -

 dictionary[key] = null;

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

 if (dictionary.ContainsKey(key)) 
        dictionary[key] = null;
 else
        dictionary.Add(key, null);

Обратите внимание, что значение null имеет ноль влияние на то, что там было сохранено ранее.

...