System.CultureAwareComparer
using System.Globalization;
namespace System
{
[Serializable]
internal sealed class CultureAwareComparer:System.StringComparer
{
private System.Globalization.CompareInfo _compareInfo;
private bool _ignoreCase;
internal CultureAwareComparer(System.Globalization.CultureInfo culture,bool ignoreCase):base()
{
//.maxstack 8
//IL_0000: ldarg.0
//IL_0001: call instance void System.StringComparer::.ctor()
//IL_0006: ldarg.0
//IL_0007: ldarg.1
//IL_0008: callvirt instance class System.Globalization.CompareInfo System.Globalization.CultureInfo::get_CompareInfo()
//IL_000d: stfld class System.Globalization.CompareInfo System.CultureAwareComparer::_compareInfo
//IL_0012: ldarg.0
//IL_0013: ldarg.2
//IL_0014: stfld bool System.CultureAwareComparer::_ignoreCase
//IL_0019: ret
this._compareInfo = culture.CompareInfo;
this._ignoreCase = ignoreCase;
}
public override int Compare(string x,string y)
{
//.maxstack 8
//IL_0000: ldarg.1
//IL_0001: ldarg.2
//IL_0002: call bool System.Object::ReferenceEquals(object,
//object)
//IL_0007: brfalse.s IL_000b
//IL_0009: ldc.i4.0
//IL_000a: ret
//IL_000b: ldarg.1
//IL_000c: brtrue.s IL_0010
//IL_000e: ldc.i4.m1
//IL_000f: ret
//IL_0010: ldarg.2
//IL_0011: brtrue.s IL_0015
//IL_0013: ldc.i4.1
//IL_0014: ret
//IL_0015: ldarg.0
//IL_0016: ldfld class System.Globalization.CompareInfo System.CultureAwareComparer::_compareInfo
//IL_001b: ldarg.1
//IL_001c: ldarg.2
//IL_001d: ldarg.0
//IL_001e: ldfld bool System.CultureAwareComparer::_ignoreCase
//IL_0023: brtrue.s IL_0028
//IL_0025: ldc.i4.0
//IL_0026: br.s IL_0029
//IL_0028: ldc.i4.1
//IL_0029: callvirt instance int32 System.Globalization.CompareInfo::Compare(string,
//string,
//valuetype System.Globalization.CompareOptions)
//IL_002e: ret
if (object.ReferenceEquals(x, y))
{
return 0;
}
else if (x == null)
{
return -1;
}
else if (y == null)
{
return 1;
}
else
{
if (this._ignoreCase)
{
return this._compareInfo.Compare(x, y, CompareOptions.IgnoreCase);
}
else
{
return this._compareInfo.Compare(x, y, CompareOptions.None);
}
}
}
public override bool Equals(string x,string y)
{
//.maxstack 8
//IL_0000: ldarg.1
//IL_0001: ldarg.2
//IL_0002: call bool System.Object::ReferenceEquals(object,
//object)
//IL_0007: brfalse.s IL_000b
//IL_0009: ldc.i4.1
//IL_000a: ret
//IL_000b: ldarg.1
//IL_000c: brfalse.s IL_0011
//IL_000e: ldarg.2
//IL_000f: brtrue.s IL_0013
//IL_0011: ldc.i4.0
//IL_0012: ret
//IL_0013: ldarg.0
//IL_0014: ldfld class System.Globalization.CompareInfo System.CultureAwareComparer::_compareInfo
//IL_0019: ldarg.1
//IL_001a: ldarg.2
//IL_001b: ldarg.0
//IL_001c: ldfld bool System.CultureAwareComparer::_ignoreCase
//IL_0021: brtrue.s IL_0026
//IL_0023: ldc.i4.0
//IL_0024: br.s IL_0027
//IL_0026: ldc.i4.1
//IL_0027: callvirt instance int32 System.Globalization.CompareInfo::Compare(string,
//string,
//valuetype System.Globalization.CompareOptions)
//IL_002c: ldc.i4.0
//IL_002d: ceq
//IL_002f: ret
if (object.ReferenceEquals(x, y))
{
return true;
}
else if (x == null)
{
return false;
}
else if (y == null)
{
return false;
}
else
{
if (this._ignoreCase)
{
return this._compareInfo.Compare(x, y, CompareOptions.IgnoreCase) == 0;
}
else
{
return this._compareInfo.Compare(x, y, CompareOptions.None) == 0;
}
}
}
public override int GetHashCode(string obj)
{
//.maxstack 8
//IL_0000: ldarg.1
//IL_0001: brtrue.s IL_000e
//IL_0003: ldstr "obj"
//IL_0008: newobj instance void System.ArgumentNullException::.ctor(string)
//IL_000d: throw
//IL_000e: ldarg.0
//IL_000f: ldfld bool System.CultureAwareComparer::_ignoreCase
//IL_0014: brfalse.s IL_0024
//IL_0016: ldarg.0
//IL_0017: ldfld class System.Globalization.CompareInfo System.CultureAwareComparer::_compareInfo
//IL_001c: ldarg.1
//IL_001d: ldc.i4.1
//IL_001e: callvirt instance int32 System.Globalization.CompareInfo::GetHashCodeOfString(string,
//valuetype System.Globalization.CompareOptions)
//IL_0023: ret
//IL_0024: ldarg.0
//IL_0025: ldfld class System.Globalization.CompareInfo System.CultureAwareComparer::_compareInfo
//IL_002a: ldarg.1
//IL_002b: ldc.i4.0
//IL_002c: callvirt instance int32 System.Globalization.CompareInfo::GetHashCodeOfString(string,
//valuetype System.Globalization.CompareOptions)
//IL_0031: ret
if (obj == null)
{
throw new System.ArgumentNullException("obj");
}
else
{
if (this._ignoreCase)
{
return this._compareInfo.GetHashCodeOfString(obj, CompareOptions.IgnoreCase);
}
else
{
return this._compareInfo.GetHashCodeOfString(obj, CompareOptions.None);
}
}
}
public override bool Equals(object obj)
{
//.maxstack 2
//.locals init (class System.CultureAwareComparer V_0)
//IL_0000: ldarg.1
//IL_0001: isinst System.CultureAwareComparer
//IL_0006: stloc.0
//IL_0007: ldloc.0
//IL_0008: brtrue.s IL_000c
//IL_000a: ldc.i4.0
//IL_000b: ret
//IL_000c: ldarg.0
//IL_000d: ldfld bool System.CultureAwareComparer::_ignoreCase
//IL_0012: ldloc.0
//IL_0013: ldfld bool System.CultureAwareComparer::_ignoreCase
//IL_0018: bne.un.s IL_002c
//IL_001a: ldarg.0
//IL_001b: ldfld class System.Globalization.CompareInfo System.CultureAwareComparer::_compareInfo
//IL_0020: ldloc.0
//IL_0021: ldfld class System.Globalization.CompareInfo System.CultureAwareComparer::_compareInfo
//IL_0026: callvirt instance bool System.Object::Equals(object)
//IL_002b: ret
//IL_002c: ldc.i4.0
//IL_002d: ret
CultureAwareComparer V_0;
V_0 = (obj as CultureAwareComparer);
if (V_0 == null)
{
return false;
}
else
{
if (this._ignoreCase != V_0._ignoreCase)
{
return false;
}
else
{
return this._compareInfo.Equals(V_0.compareInfo);
}
}
}
public override int GetHashCode()
{
//.maxstack 2
//.locals init (int32 V_0)
//IL_0000: ldarg.0
//IL_0001: ldfld class System.Globalization.CompareInfo System.CultureAwareComparer::_compareInfo
//IL_0006: callvirt instance int32 System.Object::GetHashCode()
//IL_000b: stloc.0
//IL_000c: ldarg.0
//IL_000d: ldfld bool System.CultureAwareComparer::_ignoreCase
//IL_0012: brtrue.s IL_0016
//IL_0014: ldloc.0
//IL_0015: ret
//IL_0016: ldloc.0
//IL_0017: not
//IL_0018: ret
int V_0;
V_0=this._compareInfo.GetHashCode();
if (this._ignoreCase)
{
return V_0;
}
else
{
return ~V_0;
}
}
}
}