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
- TransactionManager.cs
- RightsManagementProvider.cs
- WorkflowApplicationUnloadedException.cs
- XPathNavigatorKeyComparer.cs
- EnvelopeVersion.cs
- HitTestResult.cs
- OdbcError.cs
- ILGenerator.cs
- DbConnectionInternal.cs
- CodeFieldReferenceExpression.cs
- ColorContextHelper.cs
- pingexception.cs
- JapaneseLunisolarCalendar.cs
- Visitor.cs
- ObjectDataSourceView.cs
- LinqDataSourceDisposeEventArgs.cs
- ISAPIWorkerRequest.cs
- DispatchRuntime.cs
- IncrementalHitTester.cs
- ContextMarshalException.cs
- GridViewEditEventArgs.cs
- OdbcConnectionStringbuilder.cs
- ITextView.cs
- EventProvider.cs
- XmlNodeWriter.cs
- FlowNode.cs
- DefaultTextStore.cs
- DockAndAnchorLayout.cs
- SmtpDigestAuthenticationModule.cs
- ResourceDescriptionAttribute.cs
- WebBrowser.cs
- DataGridViewTextBoxCell.cs
- CollectionExtensions.cs
- PropertyGrid.cs
- DrawingContextWalker.cs
- ErrorFormatter.cs
- StreamSecurityUpgradeAcceptorAsyncResult.cs
- TextBox.cs
- DoubleLinkListEnumerator.cs
- WebColorConverter.cs
- TreeNodeMouseHoverEvent.cs
- Interfaces.cs
- Converter.cs
- NonSerializedAttribute.cs
- ValidatorCollection.cs
- PathFigure.cs
- FormViewDesigner.cs
- PowerStatus.cs
- WSSecurityXXX2005.cs
- Tokenizer.cs
- PlanCompilerUtil.cs
- XhtmlTextWriter.cs
- WebPartZoneBase.cs
- ServiceDescriptionData.cs
- AssemblyAttributesGoHere.cs
- CustomExpressionEventArgs.cs
- ToolStripHighContrastRenderer.cs
- SearchForVirtualItemEventArgs.cs
- FileDialog_Vista_Interop.cs
- DocumentPage.cs
- Recipient.cs
- MemberAssignmentAnalysis.cs
- SecurityUtils.cs
- GPStream.cs
- LiteralSubsegment.cs
- DragDrop.cs
- PersonalizationEntry.cs
- Message.cs
- DataGridRow.cs
- FileRegion.cs
- RelatedCurrencyManager.cs
- HatchBrush.cs
- IntSecurity.cs
- ConstructorBuilder.cs
- MetadataArtifactLoaderXmlReaderWrapper.cs
- FieldNameLookup.cs
- EventLogRecord.cs
- XPathNavigatorReader.cs
- SubstitutionDesigner.cs
- Cursors.cs
- AssemblyGen.cs
- Enum.cs
- TypeSystem.cs
- WSHttpBindingCollectionElement.cs
- ExpressionBuilderCollection.cs
- XmlCompatibilityReader.cs
- SourceFileInfo.cs
- Validator.cs
- WmpBitmapEncoder.cs
- ADMembershipProvider.cs
- ServiceEndpointElement.cs
- UserCancellationException.cs
- PrinterSettings.cs
- FontSource.cs
- SessionStateModule.cs
- IfAction.cs
- Transactions.cs
- WindowsToolbarItemAsMenuItem.cs
- RetrieveVirtualItemEventArgs.cs
- EpmSyndicationContentSerializer.cs