From 712d3f37a91ef749f5db1921e0268e676281fe05 Mon Sep 17 00:00:00 2001 From: Steve Bohlen Date: Sun, 22 Nov 2015 16:00:00 -0500 Subject: [PATCH] fix bug in Remove() method so that it properly removes the individual item after reworking linkedHead and linkedTail --- .../Generic/LinkedHashDictionary.cs | 201 +++++++++--------- .../Spring.Core.Tests.2010.csproj | 3 +- 2 files changed, 107 insertions(+), 97 deletions(-) diff --git a/src/Spring/Spring.Core/Collections/Generic/LinkedHashDictionary.cs b/src/Spring/Spring.Core/Collections/Generic/LinkedHashDictionary.cs index f29e5d28..c68d15f4 100644 --- a/src/Spring/Spring.Core/Collections/Generic/LinkedHashDictionary.cs +++ b/src/Spring/Spring.Core/Collections/Generic/LinkedHashDictionary.cs @@ -25,113 +25,122 @@ using System.Text; namespace Spring.Collections.Generic { - /// - /// IDictionary implementation which preserves the order of inserted items. - /// - /// Zbynek Vyskovsky, kvr@centrum.cz - public class LinkedHashDictionary: AbstractDictionary - { - public override void Add(TKey key, TValue value) - { - Node node; - if (items.TryGetValue(key, out node)) { - node.value = value; - } - else { - node = new Node(); - node.key = key; - node.value = value; - if ((node.previousLinked = linkedTail) != null) - node.previousLinked.nextLinked = node; - node.nextLinked = null; - linkedTail = node; - if (linkedHead == null) - linkedHead = node; - items.Add(key, node); - } - } + /// + /// IDictionary implementation which preserves the order of inserted items. + /// + /// Zbynek Vyskovsky, kvr@centrum.cz + public class LinkedHashDictionary : AbstractDictionary + { + public override void Add(TKey key, TValue value) + { + Node node; + if (items.TryGetValue(key, out node)) + { + node.value = value; + } + else + { + node = new Node(); + node.key = key; + node.value = value; + if ((node.previousLinked = linkedTail) != null) + node.previousLinked.nextLinked = node; + node.nextLinked = null; + linkedTail = node; + if (linkedHead == null) + linkedHead = node; + items.Add(key, node); + } + } - public override bool ContainsKey(TKey key) - { - return items.ContainsKey(key); - } + public override bool ContainsKey(TKey key) + { + return items.ContainsKey(key); + } - public override bool Remove(TKey key) - { - Node node; - if (!items.TryGetValue(key, out node)) - return false; + public override bool Remove(TKey key) + { + Node node; + if (!items.TryGetValue(key, out node)) + return false; - if (node.previousLinked != null) { - node.previousLinked.nextLinked = node.nextLinked; - } - else { - linkedHead = node.nextLinked; - } + if (node.previousLinked != null) + { + node.previousLinked.nextLinked = node.nextLinked; + } + else + { + linkedHead = node.nextLinked; + } - if (node.nextLinked != null) { - node.nextLinked.previousLinked = node.previousLinked; - } - else { - linkedTail = node.previousLinked; - } - - return true; - } + if (node.nextLinked != null) + { + node.nextLinked.previousLinked = node.previousLinked; + } + else + { + linkedTail = node.previousLinked; + } - public override bool TryGetValue(TKey key, out TValue value) - { - Node node; - if (!items.TryGetValue(key, out node)) { - value = default(TValue); - return false; - } - value = node.value; - return true; - } + items.Remove(key); - public override void Clear() - { - items.Clear(); - linkedHead = null; - linkedTail = null; - } + return true; + } - public override bool Remove(KeyValuePair item) - { - Node node; - if (!items.TryGetValue(item.Key, out node)) - return false; - if (!node.value.Equals(item.Value)) - return false; - return Remove(item.Key); - } + public override bool TryGetValue(TKey key, out TValue value) + { + Node node; + if (!items.TryGetValue(key, out node)) + { + value = default(TValue); + return false; + } + value = node.value; + return true; + } - public override int Count - { - get { return items.Count; } - } + public override void Clear() + { + items.Clear(); + linkedHead = null; + linkedTail = null; + } - protected class Node - { - public TKey key; - public TValue value; + public override bool Remove(KeyValuePair item) + { + Node node; + if (!items.TryGetValue(item.Key, out node)) + return false; + if (!node.value.Equals(item.Value)) + return false; + return Remove(item.Key); + } - public Node previousLinked; - public Node nextLinked; - } + public override int Count + { + get { return items.Count; } + } - protected override IEnumerable> EntriesSet() - { - List> entries = new List>(); - for (Node node = linkedHead; node != null; node = node.nextLinked) - entries.Add(new KeyValuePair(node.key, node.value)); - return entries; - } + protected class Node + { + public TKey key; + public TValue value; - private Node linkedHead = null; - private Node linkedTail = null; + public Node previousLinked; + public Node nextLinked; + } - private Dictionary items = new Dictionary(); - } + protected override IEnumerable> EntriesSet() + { + List> entries = new List>(); + for (Node node = linkedHead; node != null; node = node.nextLinked) + entries.Add(new KeyValuePair(node.key, node.value)); + return entries; + } + + private Node linkedHead = null; + private Node linkedTail = null; + + private Dictionary items = new Dictionary(); + } } diff --git a/test/Spring/Spring.Core.Tests/Spring.Core.Tests.2010.csproj b/test/Spring/Spring.Core.Tests/Spring.Core.Tests.2010.csproj index f34919cb..3e71ce2f 100644 --- a/test/Spring/Spring.Core.Tests/Spring.Core.Tests.2010.csproj +++ b/test/Spring/Spring.Core.Tests/Spring.Core.Tests.2010.csproj @@ -127,7 +127,8 @@ Code - + + Code