public void SerializationTest(StringComparison comparison) { var dict = new StringKeyedDictionary <int>(StringSegmentComparer.FromComparison(comparison)) { { "alpha", 1 }, { "beta", 2 }, { "gamma", 3 }, { "delta", 4 }, { "epsilon", 5 } }; // By BinarySerializationFormatter StringKeyedDictionary <int> clone = dict.DeepClone(); Assert.AreNotSame(dict, clone); Assert.AreEqual(dict.Count, clone.Count); CollectionAssert.AreEqual(dict, clone); // By BinaryFormatter var formatter = new BinaryFormatter(); using var ms = new MemoryStream(); formatter.Serialize(ms, dict); ms.Position = 0; clone = (StringKeyedDictionary <int>)formatter.Deserialize(ms); CollectionAssert.AreEqual(dict, clone); }
public void AccessTest(StringComparison?comparison) { const int count = 100_000; StringComparer sc = null; StringSegmentComparer ssc = null; if (comparison != null) { #if NETFRAMEWORK || NETSTANDARD2_0 sc = comparison.Value switch { StringComparison.Ordinal => StringComparer.Ordinal, StringComparison.OrdinalIgnoreCase => StringComparer.OrdinalIgnoreCase, StringComparison.InvariantCulture => StringComparer.InvariantCulture, StringComparison.InvariantCultureIgnoreCase => StringComparer.InvariantCultureIgnoreCase, _ => throw new ArgumentOutOfRangeException(nameof(comparison)) }; #else sc = StringComparer.FromComparison(comparison.Value); #endif ssc = StringSegmentComparer.FromComparison(comparison.Value); } Dictionary <string, int> dictionary = Enumerable.Range(0, count).ToDictionary(i => i.ToString(CultureInfo.InvariantCulture), sc); var strDict = new StringKeyedDictionary <int>(dictionary, ssc); new IteratorPerformanceTest <int> { TestName = "Indexer access test", Iterations = count } .AddCase(i => dictionary[i.ToString(CultureInfo.InvariantCulture)], "Dictionary read") .AddCase(i => strDict[i.ToString(CultureInfo.InvariantCulture)], "StringKeyedDictionary read (string)") .AddCase(i => strDict[i.ToString(CultureInfo.InvariantCulture).AsSegment()], "StringKeyedDictionary read (StringSegment)") #if !(NETFRAMEWORK || NETSTANDARD2_0 || NETCOREAPP2_0) .AddCase(i => strDict[i.ToString(CultureInfo.InvariantCulture).AsSpan()], "StringKeyedDictionary read (ReadOnlySpan<char>)") #endif .DoTest() .DumpResults(Console.Out); }
public void UsageTest(StringComparison?comparison) { var dict = comparison == null ? new StringKeyedDictionary <int>() : new StringKeyedDictionary <int>(StringSegmentComparer.FromComparison(comparison.Value)); dict.Add("alpha", 1); dict.Add("beta", 2); dict.Add("gamma", 3); Assert.AreEqual(3, dict.Count); Assert.AreEqual(1, dict["alpha"]); Assert.AreEqual(1, dict["alpha".AsSegment()]); #if !(NETFRAMEWORK || NETSTANDARD2_0 || NETCOREAPP2_0) Assert.AreEqual(1, dict["alpha".AsSpan()]); #endif // remove and re-add by string Assert.IsTrue(dict.Remove("alpha")); Assert.AreEqual(2, dict.Count); Assert.IsFalse(dict.Remove("alpha")); Assert.IsTrue(dict.Remove("beta")); dict.Add("alpha", -1); Assert.AreEqual(2, dict.Count); Assert.AreEqual(-1, dict["alpha"]); Assert.AreEqual(-1, dict["alpha".AsSegment()]); #if !(NETFRAMEWORK || NETSTANDARD2_0 || NETCOREAPP2_0) Assert.AreEqual(-1, dict["alpha".AsSpan()]); #endif // Clear dict.Clear(); Assert.AreEqual(0, dict.Count); dict.Add("alpha", 42); Assert.AreEqual(42, dict["alpha"]); }