System.Collections.Immutable by Microsoft

<PackageReference Include="System.Collections.Immutable" Version="8.0.0-preview.7.23375.6" />

.NET API 253,104 bytes

 LengthBuckets

static class LengthBuckets
using System.Buffers; using System.Collections.Generic; using System.Runtime.CompilerServices; namespace System.Collections.Frozen { internal static class LengthBuckets { internal const int MaxPerLength = 5; private const double EmptyLengthsRatio = 0.2; [System.Runtime.CompilerServices.NullableContext(1)] [return: System.Runtime.CompilerServices.Nullable(2)] internal static int[] CreateLengthBucketsArrayIfAppropriate(string[] keys, IEqualityComparer<string> comparer, int minLength, int maxLength) { int num = maxLength - minLength + 1; if (keys.Length / num > 5) return null; int num2 = num * 5; if (num2 > 2147483591) return null; int[] array = ArrayPool<int>.Shared.Rent(num2); Span<int> span = MemoryExtensions.AsSpan(array, 0, num2); span.Fill(-1); int num3 = 0; for (int i = 0; i < keys.Length; i++) { string text = keys[i]; int num4 = (text.Length - minLength) * 5; int num5 = num4 + 5; int j; for (j = num4; j < num5; j++) { ref int reference = ref array[j]; if (reference < 0) { if (j == num4) num3++; reference = i; break; } } if (j == num5) { ArrayPool<int>.Shared.Return(array, false); return null; } } if ((double)num3 / (double)num < 0.2) { ArrayPool<int>.Shared.Return(array, false); return null; } span = MemoryExtensions.AsSpan(array, 0, num2); int[] result = span.ToArray(); ArrayPool<int>.Shared.Return(array, false); return result; } } }