@@ -195,25 +195,36 @@ module ObjectListFilter =
195195 |> Seq.head
196196
197197 /// Maps an IComparer to a StringComparison value.
198- /// Returns ValueNone for null or Ordinal comparers (use default Expression.Equal path) .
199- let private comparerToStringComparison ( comparer : IComparer ) =
198+ /// Returns ValueNone for null or unsupported comparers.
199+ let internal comparerToStringComparison ( comparer : IComparer ) =
200200 match comparer with
201201 | null -> ValueNone
202202 | :? StringComparer as sc ->
203- if obj.ReferenceEquals ( sc, StringComparer.OrdinalIgnoreCase) then
204- ValueSome StringComparison.OrdinalIgnoreCase
205- elif obj.ReferenceEquals ( sc, StringComparer.InvariantCultureIgnoreCase) then
206- ValueSome StringComparison.InvariantCultureIgnoreCase
207- elif obj.ReferenceEquals ( sc, StringComparer.CurrentCultureIgnoreCase) then
208- ValueSome StringComparison.CurrentCultureIgnoreCase
209- elif obj.ReferenceEquals ( sc, StringComparer.Ordinal) then
210- ValueSome StringComparison.Ordinal
211- elif obj.ReferenceEquals ( sc, StringComparer.InvariantCulture) then
212- ValueSome StringComparison.InvariantCulture
213- elif obj.ReferenceEquals ( sc, StringComparer.CurrentCulture) then
214- ValueSome StringComparison.CurrentCulture
203+ let mutable isOrdinalIgnoreCase = false
204+
205+ if StringComparer.IsWellKnownOrdinalComparer ( sc, & isOrdinalIgnoreCase) then
206+ if isOrdinalIgnoreCase then
207+ ValueSome StringComparison.OrdinalIgnoreCase
208+ else
209+ ValueSome StringComparison.Ordinal
215210 else
216- ValueNone
211+ let mutable compareInfo = Unchecked.defaultof< Globalization.CompareInfo>
212+ let mutable compareOptions = Globalization.CompareOptions.None
213+
214+ if StringComparer.IsWellKnownCultureAwareComparer ( sc, & compareInfo, & compareOptions) then
215+ let isCurrentCulture = compareInfo.Equals Globalization.CultureInfo.CurrentCulture.CompareInfo
216+ let isInvariantCulture = compareInfo.Equals Globalization.CultureInfo.InvariantCulture.CompareInfo
217+
218+ match compareOptions with
219+ | Globalization.CompareOptions.None when isCurrentCulture -> ValueSome StringComparison.CurrentCulture
220+ | Globalization.CompareOptions.IgnoreCase when isCurrentCulture ->
221+ ValueSome StringComparison.CurrentCultureIgnoreCase
222+ | Globalization.CompareOptions.None when isInvariantCulture -> ValueSome StringComparison.InvariantCulture
223+ | Globalization.CompareOptions.IgnoreCase when isInvariantCulture ->
224+ ValueSome StringComparison.InvariantCultureIgnoreCase
225+ | _ -> ValueNone
226+ else
227+ ValueNone
217228 | _ -> ValueNone
218229
219230 /// Gets the type from a MemberInfo (PropertyInfo or FieldInfo).
0 commit comments