Update Reference Sources to .NET Framework 4.6
[mono.git] / mcs / class / referencesource / System.Data.Entity / System / Data / Common / Utils / TrailingSpaceComparer.cs
1 //---------------------------------------------------------------------
2 // <copyright file="TrailingSpaceComparer.cs" company="Microsoft">
3 //      Copyright (c) Microsoft Corporation.  All rights reserved.
4 // </copyright>
5 //
6 // @owner Microsoft
7 // @backupOwner Microsoft
8 //---------------------------------------------------------------------
9
10 using System.Collections.Generic;
11 namespace System.Data.Common.Utils
12 {
13     /// <summary>
14     /// Comparer that treats two strings as equivalent if they differ only by trailing
15     /// spaces, e.g. 'A' eq 'A   '. Useful when determining if a set of values is unique
16     /// even given the possibility of padding (consider SQL Server char and nchar columns)
17     /// or to lookup values when the set of values is known to honor this uniqueness constraint.
18     /// </summary>
19     internal class TrailingSpaceComparer : IEqualityComparer<object>
20     {
21         private TrailingSpaceComparer() { }
22         internal readonly static TrailingSpaceComparer Instance = new TrailingSpaceComparer();
23         private readonly static IEqualityComparer<object> s_template = EqualityComparer<object>.Default;
24         bool IEqualityComparer<object>.Equals(object x, object y)
25         {
26             string xAsString = x as string;
27             if (null != xAsString)
28             {
29                 string yAsString = y as string;
30                 if (null != yAsString)
31                 {
32                     return TrailingSpaceStringComparer.Instance.Equals(xAsString, yAsString);
33                 }
34             }
35             return s_template.Equals(x, y);
36         }
37         int IEqualityComparer<object>.GetHashCode(object obj)
38         {
39             string value = obj as string;
40             if (null != value)
41             {
42                 return TrailingSpaceStringComparer.Instance.GetHashCode(value);
43             }
44             return s_template.GetHashCode(obj);
45         }
46     }
47
48     /// <summary>
49     /// Typed version of TrailingSpaceComparer.
50     /// </summary>
51     internal class TrailingSpaceStringComparer : IEqualityComparer<string>
52     {
53         internal static readonly TrailingSpaceStringComparer Instance = new TrailingSpaceStringComparer();
54         private TrailingSpaceStringComparer() { }
55         public bool Equals(string x, string y)
56         {
57             return StringComparer.OrdinalIgnoreCase.Equals(NormalizeString(x), NormalizeString(y));
58         }
59         public int GetHashCode(string obj)
60         {
61             return StringComparer.OrdinalIgnoreCase.GetHashCode(NormalizeString(obj));
62         }
63         internal static string NormalizeString(string value)
64         {
65             if (null == value || !value.EndsWith(" ", StringComparison.Ordinal)) { return value; }
66             else { return value.TrimEnd(' '); }
67         }
68     }
69 }