From 1a66c6dca00026cbab1d5571774b3ecca787580a Mon Sep 17 00:00:00 2001 From: Adam Lemmon Date: Fri, 27 Apr 2018 12:35:56 -0600 Subject: [PATCH 1/2] UPDATED: Full key equality comparer to use default comparer instead of reference comparer ADDED: A test to demonstrate my specific case Issue # 6 --- MultiKeyMap.Tests/ConcreteMultiKeyMapTests.cs | 32 +++++++++++++++++-- .../Base/NonPositionalBaseMultiKeyMap.cs | 4 +-- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/MultiKeyMap.Tests/ConcreteMultiKeyMapTests.cs b/MultiKeyMap.Tests/ConcreteMultiKeyMapTests.cs index 504b569..e6f4923 100644 --- a/MultiKeyMap.Tests/ConcreteMultiKeyMapTests.cs +++ b/MultiKeyMap.Tests/ConcreteMultiKeyMapTests.cs @@ -66,7 +66,7 @@ public ConcreteMultiKeyMapTests() return new MultiKeyMapBaseHelper(() => MultiKeyMaps.CreateMultiKeyDictionary(), k1, k2, v1, v2); } - public Func> Supplier( + public Func> Supplier( MultiKeyMaps.MultiKeyCreationStrategy strategy = OptimizedForNonPositionalSearch, ComparersStrategy compStrategy = BothNull) where K : class, IEnumerable { @@ -76,7 +76,7 @@ public Func> Supplier( case BothDefault: return () => MultiKeyMaps.CreateMultiKeyDictionary(strategy); case StructuralFullKeyOnly: - return () => MultiKeyMaps.CreateMultiKeyDictionary(EqualityComparer.Default, + return () => MultiKeyMaps.CreateMultiKeyDictionary(EqualityComparer.Default, new EnumerableEqualityComparer(EqualityComparer.Default), strategy); case StructuralBoth: return () => MultiKeyMaps.CreateMultiKeyDictionary(EqualityComparer.Default, @@ -113,7 +113,7 @@ public override int GetHashCode(K col) public void InitAll(MultiKeyMaps.MultiKeyCreationStrategy strategy, ComparersStrategy compStrategy) { - helper1.Init(Supplier(strategy, compStrategy)); + helper1.Init(Supplier(strategy, compStrategy)); helper2.Init(Supplier(strategy, compStrategy)); helper3.Init(Supplier, List>, string>(strategy, compStrategy)); helper4.Init(Supplier, List>, bool>(strategy, compStrategy)); @@ -475,5 +475,31 @@ public void SerializationTest(MultiKeyMaps.MultiKeyCreationStrategy strategy, Co myObj2.ShouldAllBeEquivalentTo(myObj1); } + + [TestMethod] + public void RemoveByFullKeyTests() + { + IMultiKeyMap, string> dict = MultiKeyMaps.CreateMultiKeyDictionary, string>(); + dict.Add(new[] { "first", "crazy", "1st" }, "one"); + dict.Add(new[] { "first", "other" }, "one again"); + dict.Add(new[] { "first", "something else" }, "one a third time"); + + IEnumerable values; + Assert.IsTrue(dict.TryGetValuesByPartialKey(new[] { "first" }, out values)); + Assert.AreEqual(3, values.Count()); + + IEnumerable> fullKeys = new[] { new[] { "first", "crazy", "1st" } }; + bool removedAny = false; + foreach (var fullKey in fullKeys) + { + removedAny |= dict.Remove(fullKey); + } + + Assert.IsTrue(removedAny); + + var tryGetValuesByPartialKey = dict.TryGetValuesByPartialKey(new[] { "first" }, out values); // Fails here even though the dictionary still contains two values that should match this partial key + Assert.IsTrue(tryGetValuesByPartialKey); + Assert.AreEqual(2, values.Count()); + } } } diff --git a/MultiKeyMap/Base/NonPositionalBaseMultiKeyMap.cs b/MultiKeyMap/Base/NonPositionalBaseMultiKeyMap.cs index 1d8d226..0005c43 100644 --- a/MultiKeyMap/Base/NonPositionalBaseMultiKeyMap.cs +++ b/MultiKeyMap/Base/NonPositionalBaseMultiKeyMap.cs @@ -37,8 +37,8 @@ protected virtual ILiteSetMultimap CreateLiteSetMultimap subKeyComparer, IEqualityComparer fullKeyComparer) where TKey : class, IEnumerable { - //return CreateSupportDictionary>(subKeyComparer).ToSetMultimap(fullKeyComparer); - return CreateSupportDictionary>(subKeyComparer).ToSetMultimap(EqualityComparerExtensions.ReferenceEqualityComparerOf()); + return CreateSupportDictionary>(subKeyComparer).ToSetMultimap(fullKeyComparer); + //return CreateSupportDictionary>(subKeyComparer).ToSetMultimap(EqualityComparerExtensions.ReferenceEqualityComparerOf()); } #region non-positional TryGetsByPartialKey From 85674b8ea2fdf91c49685e0bdf390de66d99156b Mon Sep 17 00:00:00 2001 From: Adam Lemmon Date: Fri, 27 Apr 2018 12:54:22 -0600 Subject: [PATCH 2/2] UPDATED: A comment Issue # 6 --- MultiKeyMap.Tests/ConcreteMultiKeyMapTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MultiKeyMap.Tests/ConcreteMultiKeyMapTests.cs b/MultiKeyMap.Tests/ConcreteMultiKeyMapTests.cs index e6f4923..7a7dc3e 100644 --- a/MultiKeyMap.Tests/ConcreteMultiKeyMapTests.cs +++ b/MultiKeyMap.Tests/ConcreteMultiKeyMapTests.cs @@ -497,7 +497,7 @@ public void RemoveByFullKeyTests() Assert.IsTrue(removedAny); - var tryGetValuesByPartialKey = dict.TryGetValuesByPartialKey(new[] { "first" }, out values); // Fails here even though the dictionary still contains two values that should match this partial key + var tryGetValuesByPartialKey = dict.TryGetValuesByPartialKey(new[] { "first" }, out values); // Was failing here even though the dictionary still contains two values that should match this partial key Assert.IsTrue(tryGetValuesByPartialKey); Assert.AreEqual(2, values.Count()); }