diff --git a/Akade.IndexedSet/DataStructures/Lookup.cs b/Akade.IndexedSet/DataStructures/Lookup.cs index b9648e1..e9a577f 100644 --- a/Akade.IndexedSet/DataStructures/Lookup.cs +++ b/Akade.IndexedSet/DataStructures/Lookup.cs @@ -1,4 +1,6 @@ -namespace Akade.IndexedSet.DataStructures; +using System.Runtime.InteropServices; + +namespace Akade.IndexedSet.DataStructures; /// /// Modifiable lookup based on with as value collection per key. @@ -11,10 +13,8 @@ internal class Lookup public bool Add(TKey key, TValue value) { - if (!_values.TryGetValue(key, out HashSet? keySet)) - { - keySet = _values[key] = []; - } + ref HashSet? keySet = ref CollectionsMarshal.GetValueRefOrAddDefault(_values, key, out _); + keySet ??= []; if (keySet.Add(value)) { diff --git a/Akade.IndexedSet/DataStructures/Trie.cs b/Akade.IndexedSet/DataStructures/Trie.cs index a98bd21..d98b10e 100644 --- a/Akade.IndexedSet/DataStructures/Trie.cs +++ b/Akade.IndexedSet/DataStructures/Trie.cs @@ -1,6 +1,7 @@ using Akade.IndexedSet.Extensions; using Akade.IndexedSet.Utils; using System.Diagnostics.CodeAnalysis; +using System.Runtime.InteropServices; namespace Akade.IndexedSet.DataStructures; @@ -177,11 +178,10 @@ internal bool Add(ReadOnlySpan key, TElement element) else { _children ??= []; - if (!_children.TryGetValue(key[0], out TrieNode? trieNode)) - { - _children[key[0]] = trieNode = new(); - } + ref TrieNode? trieNode = ref CollectionsMarshal.GetValueRefOrAddDefault(_children, key[0], out _); + + trieNode ??= new(); return trieNode.Add(key[1..], element); } }