From df148a6b3a19722dc1eea51e756c644279fedf16 Mon Sep 17 00:00:00 2001 From: Advitalitum Date: Sun, 27 Sep 2026 01:35:12 +0300 Subject: [PATCH 1/5] Add fast path for Overlaps --- .../Frozen/FrozenSetInternalBase.cs | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/libraries/System.Collections.Immutable/src/System/Collections/Frozen/FrozenSetInternalBase.cs b/src/libraries/System.Collections.Immutable/src/System/Collections/Frozen/FrozenSetInternalBase.cs index 4afe1f7503e757..5680e60cc72a17 100644 --- a/src/libraries/System.Collections.Immutable/src/System/Collections/Frozen/FrozenSetInternalBase.cs +++ b/src/libraries/System.Collections.Immutable/src/System/Collections/Frozen/FrozenSetInternalBase.cs @@ -130,6 +130,17 @@ private protected override bool OverlapsCore(IEnumerable other) { Debug.Assert(_thisSet.Count != 0, "EmptyFrozenSet should have been used."); + // Fast path for Overlaps when other is IReadOnlySet with fast lookup and same equality comparer + if (other is IReadOnlySet otherAsSet && ComparersAreCompatible(otherAsSet)) + { + return otherAsSet.Count > Count ? OverlapsCompatibleReadOnlySetImpl(this, otherAsSet) : OverlapsCompatibleReadOnlySetImpl(otherAsSet, this); + } + + return OverlapsEnumerableImpl(other); + } + + private bool OverlapsEnumerableImpl(IEnumerable other) + { foreach (T element in other) { if (_thisSet.FindItemIndex(element) >= 0) @@ -141,6 +152,19 @@ private protected override bool OverlapsCore(IEnumerable other) return false; } + private static bool OverlapsCompatibleReadOnlySetImpl(IReadOnlySet smaller, IReadOnlySet larger) + { + foreach (T element in smaller) + { + if (larger.Contains(element)) + { + return true; + } + } + + return false; + } + /// private protected override bool SetEqualsCore(IEnumerable other) { From 1f4f341aafaf3fe7878ea7c15a005518b4c2028b Mon Sep 17 00:00:00 2001 From: Advitalitum Date: Sun, 27 Sep 2026 01:41:38 +0300 Subject: [PATCH 2/5] Add line breaks --- .../src/System/Collections/Frozen/FrozenSetInternalBase.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/libraries/System.Collections.Immutable/src/System/Collections/Frozen/FrozenSetInternalBase.cs b/src/libraries/System.Collections.Immutable/src/System/Collections/Frozen/FrozenSetInternalBase.cs index 5680e60cc72a17..7494e26c9d56dc 100644 --- a/src/libraries/System.Collections.Immutable/src/System/Collections/Frozen/FrozenSetInternalBase.cs +++ b/src/libraries/System.Collections.Immutable/src/System/Collections/Frozen/FrozenSetInternalBase.cs @@ -133,7 +133,9 @@ private protected override bool OverlapsCore(IEnumerable other) // Fast path for Overlaps when other is IReadOnlySet with fast lookup and same equality comparer if (other is IReadOnlySet otherAsSet && ComparersAreCompatible(otherAsSet)) { - return otherAsSet.Count > Count ? OverlapsCompatibleReadOnlySetImpl(this, otherAsSet) : OverlapsCompatibleReadOnlySetImpl(otherAsSet, this); + return otherAsSet.Count > Count + ? OverlapsCompatibleReadOnlySetImpl(this, otherAsSet) + : OverlapsCompatibleReadOnlySetImpl(otherAsSet, this); } return OverlapsEnumerableImpl(other); From 40811cf4e3f6ed83986ec6c587ea28b3534c82a9 Mon Sep 17 00:00:00 2001 From: Advitalitum Date: Sun, 27 Sep 2026 02:54:56 +0300 Subject: [PATCH 3/5] Fix trailing whitespace --- .../src/System/Collections/Frozen/FrozenSetInternalBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/System.Collections.Immutable/src/System/Collections/Frozen/FrozenSetInternalBase.cs b/src/libraries/System.Collections.Immutable/src/System/Collections/Frozen/FrozenSetInternalBase.cs index 7494e26c9d56dc..e8e141832173d2 100644 --- a/src/libraries/System.Collections.Immutable/src/System/Collections/Frozen/FrozenSetInternalBase.cs +++ b/src/libraries/System.Collections.Immutable/src/System/Collections/Frozen/FrozenSetInternalBase.cs @@ -139,7 +139,7 @@ private protected override bool OverlapsCore(IEnumerable other) } return OverlapsEnumerableImpl(other); - } + } private bool OverlapsEnumerableImpl(IEnumerable other) { From 586d79c37849e16f20b58e678d3913e0a2d18460 Mon Sep 17 00:00:00 2001 From: Advitalitum Date: Sun, 27 Sep 2026 03:08:09 +0300 Subject: [PATCH 4/5] FrozenSet not always implement IReadOnlySet --- .../Frozen/FrozenSetInternalBase.cs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/libraries/System.Collections.Immutable/src/System/Collections/Frozen/FrozenSetInternalBase.cs b/src/libraries/System.Collections.Immutable/src/System/Collections/Frozen/FrozenSetInternalBase.cs index e8e141832173d2..3f2bdf2c4f2459 100644 --- a/src/libraries/System.Collections.Immutable/src/System/Collections/Frozen/FrozenSetInternalBase.cs +++ b/src/libraries/System.Collections.Immutable/src/System/Collections/Frozen/FrozenSetInternalBase.cs @@ -134,8 +134,8 @@ private protected override bool OverlapsCore(IEnumerable other) if (other is IReadOnlySet otherAsSet && ComparersAreCompatible(otherAsSet)) { return otherAsSet.Count > Count - ? OverlapsCompatibleReadOnlySetImpl(this, otherAsSet) - : OverlapsCompatibleReadOnlySetImpl(otherAsSet, this); + ? OverlapsCompatibleSetImpl(this, otherAsSet) + : OverlapsCompatibleSetImpl(otherAsSet, this); } return OverlapsEnumerableImpl(other); @@ -154,7 +154,20 @@ private bool OverlapsEnumerableImpl(IEnumerable other) return false; } - private static bool OverlapsCompatibleReadOnlySetImpl(IReadOnlySet smaller, IReadOnlySet larger) + private static bool OverlapsCompatibleSetImpl(FrozenSet smaller, IReadOnlySet larger) + { + foreach (T element in smaller) + { + if (larger.Contains(element)) + { + return true; + } + } + + return false; + } + + private static bool OverlapsCompatibleSetImpl(IReadOnlySet smaller, FrozenSet larger) { foreach (T element in smaller) { From a41ce12fb03802de7620038878ca64ec67a7f47c Mon Sep 17 00:00:00 2001 From: Advitalitum Date: Sun, 27 Sep 2026 03:26:02 +0300 Subject: [PATCH 5/5] Rename new methods --- .../System/Collections/Frozen/FrozenSetInternalBase.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libraries/System.Collections.Immutable/src/System/Collections/Frozen/FrozenSetInternalBase.cs b/src/libraries/System.Collections.Immutable/src/System/Collections/Frozen/FrozenSetInternalBase.cs index 3f2bdf2c4f2459..f36ce9cf0eb0ea 100644 --- a/src/libraries/System.Collections.Immutable/src/System/Collections/Frozen/FrozenSetInternalBase.cs +++ b/src/libraries/System.Collections.Immutable/src/System/Collections/Frozen/FrozenSetInternalBase.cs @@ -134,8 +134,8 @@ private protected override bool OverlapsCore(IEnumerable other) if (other is IReadOnlySet otherAsSet && ComparersAreCompatible(otherAsSet)) { return otherAsSet.Count > Count - ? OverlapsCompatibleSetImpl(this, otherAsSet) - : OverlapsCompatibleSetImpl(otherAsSet, this); + ? SmallerFrozenSetOverlapsLargerCompatibleReadOnlySetImpl(this, otherAsSet) + : LargerFrozenSetOverlapsSmallerCompatibleReadOnlySetImpl(otherAsSet, this); } return OverlapsEnumerableImpl(other); @@ -154,7 +154,7 @@ private bool OverlapsEnumerableImpl(IEnumerable other) return false; } - private static bool OverlapsCompatibleSetImpl(FrozenSet smaller, IReadOnlySet larger) + private static bool SmallerFrozenSetOverlapsLargerCompatibleReadOnlySetImpl(FrozenSet smaller, IReadOnlySet larger) { foreach (T element in smaller) { @@ -167,7 +167,7 @@ private static bool OverlapsCompatibleSetImpl(FrozenSet smaller, IReadOnlySet return false; } - private static bool OverlapsCompatibleSetImpl(IReadOnlySet smaller, FrozenSet larger) + private static bool LargerFrozenSetOverlapsSmallerCompatibleReadOnlySetImpl(IReadOnlySet smaller, FrozenSet larger) { foreach (T element in smaller) {