Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / clr / src / BCL / System / Collections / Generic / Comparer.cs / 1 / Comparer.cs
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
using System;
using System.Collections;
using System.Collections.Generic;
namespace System.Collections.Generic
{
using System.Globalization;
using System.Runtime.CompilerServices;
[Serializable()]
[TypeDependencyAttribute("System.Collections.Generic.GenericComparer`1")]
public abstract class Comparer : IComparer, IComparer
{
static Comparer defaultComparer;
public static Comparer Default {
get {
Comparer comparer = defaultComparer;
if (comparer == null) {
comparer = CreateComparer();
defaultComparer = comparer;
}
return comparer;
}
}
private static Comparer CreateComparer() {
Type t = typeof(T);
// If T implements IComparable return a GenericComparer
if (typeof(IComparable).IsAssignableFrom(t)) {
//return (Comparer)Activator.CreateInstance(typeof(GenericComparer<>).MakeGenericType(t));
return (Comparer)(typeof(GenericComparer).TypeHandle.CreateInstanceForAnotherGenericParameter(t));
}
// If T is a Nullable where U implements IComparable return a NullableComparer
if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>)) {
Type u = t.GetGenericArguments()[0];
if (typeof(IComparable<>).MakeGenericType(u).IsAssignableFrom(u)) {
//return (Comparer)Activator.CreateInstance(typeof(NullableComparer<>).MakeGenericType(u));
return (Comparer)(typeof(NullableComparer).TypeHandle.CreateInstanceForAnotherGenericParameter(u));
}
}
// Otherwise return an ObjectComparer
return new ObjectComparer();
}
public abstract int Compare(T x, T y);
int IComparer.Compare(object x, object y) {
if (x == null) return y == null ? 0 : -1;
if (y == null) return 1;
if (x is T && y is T) return Compare((T)x, (T)y);
ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_InvalidArgumentForComparison);
return 0;
}
}
[Serializable()]
internal class GenericComparer : Comparer where T: IComparable
{
public override int Compare(T x, T y) {
if (x != null) {
if (y != null) return x.CompareTo(y);
return 1;
}
if (y != null) return -1;
return 0;
}
// Equals method for the comparer itself.
public override bool Equals(Object obj){
GenericComparer comparer = obj as GenericComparer;
return comparer != null;
}
public override int GetHashCode() {
return this.GetType().Name.GetHashCode();
}
}
[Serializable()]
internal class NullableComparer : Comparer> where T : struct, IComparable
{
public override int Compare(Nullable x, Nullable y) {
if (x.HasValue) {
if (y.HasValue) return x.value.CompareTo(y.value);
return 1;
}
if (y.HasValue) return -1;
return 0;
}
// Equals method for the comparer itself.
public override bool Equals(Object obj){
NullableComparer comparer = obj as NullableComparer;
return comparer != null;
}
public override int GetHashCode() {
return this.GetType().Name.GetHashCode();
}
}
[Serializable()]
internal class ObjectComparer : Comparer
{
public override int Compare(T x, T y) {
return System.Collections.Comparer.Default.Compare(x, y);
}
// Equals method for the comparer itself.
public override bool Equals(Object obj){
ObjectComparer comparer = obj as ObjectComparer;
return comparer != null;
}
public override int GetHashCode() {
return this.GetType().Name.GetHashCode();
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
using System;
using System.Collections;
using System.Collections.Generic;
namespace System.Collections.Generic
{
using System.Globalization;
using System.Runtime.CompilerServices;
[Serializable()]
[TypeDependencyAttribute("System.Collections.Generic.GenericComparer`1")]
public abstract class Comparer : IComparer, IComparer
{
static Comparer defaultComparer;
public static Comparer Default {
get {
Comparer comparer = defaultComparer;
if (comparer == null) {
comparer = CreateComparer();
defaultComparer = comparer;
}
return comparer;
}
}
private static Comparer CreateComparer() {
Type t = typeof(T);
// If T implements IComparable return a GenericComparer
if (typeof(IComparable).IsAssignableFrom(t)) {
//return (Comparer)Activator.CreateInstance(typeof(GenericComparer<>).MakeGenericType(t));
return (Comparer)(typeof(GenericComparer).TypeHandle.CreateInstanceForAnotherGenericParameter(t));
}
// If T is a Nullable where U implements IComparable return a NullableComparer
if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>)) {
Type u = t.GetGenericArguments()[0];
if (typeof(IComparable<>).MakeGenericType(u).IsAssignableFrom(u)) {
//return (Comparer)Activator.CreateInstance(typeof(NullableComparer<>).MakeGenericType(u));
return (Comparer)(typeof(NullableComparer).TypeHandle.CreateInstanceForAnotherGenericParameter(u));
}
}
// Otherwise return an ObjectComparer
return new ObjectComparer();
}
public abstract int Compare(T x, T y);
int IComparer.Compare(object x, object y) {
if (x == null) return y == null ? 0 : -1;
if (y == null) return 1;
if (x is T && y is T) return Compare((T)x, (T)y);
ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_InvalidArgumentForComparison);
return 0;
}
}
[Serializable()]
internal class GenericComparer : Comparer where T: IComparable
{
public override int Compare(T x, T y) {
if (x != null) {
if (y != null) return x.CompareTo(y);
return 1;
}
if (y != null) return -1;
return 0;
}
// Equals method for the comparer itself.
public override bool Equals(Object obj){
GenericComparer comparer = obj as GenericComparer;
return comparer != null;
}
public override int GetHashCode() {
return this.GetType().Name.GetHashCode();
}
}
[Serializable()]
internal class NullableComparer : Comparer> where T : struct, IComparable
{
public override int Compare(Nullable x, Nullable y) {
if (x.HasValue) {
if (y.HasValue) return x.value.CompareTo(y.value);
return 1;
}
if (y.HasValue) return -1;
return 0;
}
// Equals method for the comparer itself.
public override bool Equals(Object obj){
NullableComparer comparer = obj as NullableComparer;
return comparer != null;
}
public override int GetHashCode() {
return this.GetType().Name.GetHashCode();
}
}
[Serializable()]
internal class ObjectComparer : Comparer
{
public override int Compare(T x, T y) {
return System.Collections.Comparer.Default.Compare(x, y);
}
// Equals method for the comparer itself.
public override bool Equals(Object obj){
ObjectComparer comparer = obj as ObjectComparer;
return comparer != null;
}
public override int GetHashCode() {
return this.GetType().Name.GetHashCode();
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ReadOnlyDictionary.cs
- SystemWebExtensionsSectionGroup.cs
- HiddenField.cs
- StylusButtonEventArgs.cs
- MultiBinding.cs
- SerializableReadOnlyDictionary.cs
- StringComparer.cs
- DetailsViewDeletedEventArgs.cs
- XmlSchemaSearchPattern.cs
- RuleCache.cs
- InfocardClientCredentials.cs
- HttpApplicationStateBase.cs
- AttributeEmitter.cs
- CompositeFontParser.cs
- SafeFreeMibTable.cs
- UIPropertyMetadata.cs
- TextProperties.cs
- VersionConverter.cs
- PhysicalFontFamily.cs
- MD5.cs
- MappingItemCollection.cs
- DataGridViewTopLeftHeaderCell.cs
- ColumnBinding.cs
- CommandPlan.cs
- ApplicationServiceHelper.cs
- NetTcpBinding.cs
- NumericUpDownAcceleration.cs
- ColumnResizeUndoUnit.cs
- TypeSystem.cs
- EdmEntityTypeAttribute.cs
- XmlSchemaSearchPattern.cs
- StylusOverProperty.cs
- OleDbReferenceCollection.cs
- HyperLink.cs
- ClonableStack.cs
- HttpCacheVaryByContentEncodings.cs
- PathStreamGeometryContext.cs
- StateFinalizationDesigner.cs
- PasswordDeriveBytes.cs
- QilInvokeLateBound.cs
- LayoutEditorPart.cs
- AnimationClockResource.cs
- Decimal.cs
- GridViewRow.cs
- AutoResizedEvent.cs
- MonitorWrapper.cs
- TripleDES.cs
- CqlGenerator.cs
- XmlSchemaInferenceException.cs
- SerializationFieldInfo.cs
- LongValidatorAttribute.cs
- SocketException.cs
- ConstraintManager.cs
- DataKeyArray.cs
- CustomErrorsSectionWrapper.cs
- CompilationUtil.cs
- Matrix3D.cs
- ManualWorkflowSchedulerService.cs
- FontStyle.cs
- DateTimeConverter2.cs
- InvokeMemberBinder.cs
- CollectionBase.cs
- PolyLineSegment.cs
- WindowsSolidBrush.cs
- System.Data.OracleClient_BID.cs
- ExceptionHelpers.cs
- OperationCanceledException.cs
- TargetControlTypeAttribute.cs
- ProfileProvider.cs
- PointValueSerializer.cs
- FontFamily.cs
- ToolStripAdornerWindowService.cs
- QuaternionAnimation.cs
- PenCursorManager.cs
- EncoderBestFitFallback.cs
- xdrvalidator.cs
- PropertyBuilder.cs
- DbCommandTree.cs
- BuilderInfo.cs
- ComplusEndpointConfigContainer.cs
- LinearGradientBrush.cs
- FontInfo.cs
- GridPattern.cs
- GradientStop.cs
- ButtonChrome.cs
- DataTableReader.cs
- CancelEventArgs.cs
- ToolboxItem.cs
- Socket.cs
- PrintPreviewDialog.cs
- CachedFontFamily.cs
- Italic.cs
- SoapMessage.cs
- SerialPort.cs
- SizeKeyFrameCollection.cs
- SerializationInfoEnumerator.cs
- ListParagraph.cs
- XhtmlConformanceSection.cs
- ImageSource.cs
- IntegrationExceptionEventArgs.cs