# System.Collections.Frozen

``` diff
 namespace System.Collections.Frozen {
     public abstract class FrozenDictionary<TKey, TValue> : ICollection, ICollection<KeyValuePair<TKey, TValue>>, IDictionary, IDictionary<TKey, TValue>, IEnumerable, IEnumerable<KeyValuePair<TKey, TValue>>, IReadOnlyCollection<KeyValuePair<TKey, TValue>>, IReadOnlyDictionary<TKey, TValue> {
+        public FrozenDictionary.AlternateLookup<TAlternateKey> GetAlternateLookup<TAlternateKey>();
+        public bool TryGetAlternateLookup<TAlternateKey>(out FrozenDictionary.AlternateLookup<TAlternateKey> lookup);
+        public readonly struct AlternateLookup<TAlternateKey> {
+            public FrozenDictionary<TKey, TValue> Dictionary { get; }
+            public TValue this[TAlternateKey key] { get; }
+            public bool ContainsKey(TAlternateKey key);
+            public bool TryGetValue(TAlternateKey key, out TValue value);
+        }
     }
     public abstract class FrozenSet<T> : ICollection, ICollection<T>, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, IReadOnlySet<T>, ISet<T> {
+        public FrozenSet.AlternateLookup<TAlternate> GetAlternateLookup<TAlternate>();
+        public bool TryGetAlternateLookup<TAlternate>(out FrozenSet.AlternateLookup<TAlternate> lookup);
+        public readonly struct AlternateLookup<TAlternate> {
+            public FrozenSet<T> Set { get; }
+            public bool Contains(TAlternate item);
+            public bool TryGetValue(TAlternate equalValue, out T actualValue);
+        }
     }
 }
```

