Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / ndp / fx / src / DataSet / System / Data / DataRowComparer.cs / 1 / DataRowComparer.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //spather //----------------------------------------------------------------------------- using System; using System.Data; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Data.DataSetExtensions; namespace System.Data { ////// This class implements IEqualityComparer using value based semantics /// when comparing DataRows. /// public static class DataRowComparer { ////// Gets the singleton instance of the data row comparer. /// public static DataRowComparerDefault { get { return DataRowComparer .Default; } } internal static bool AreEqual(object a, object b) { if (Object.ReferenceEquals(a, b)) { // same reference or (null, null) or (DBNull.Value, DBNull.Value) return true; } if (Object.ReferenceEquals(a, null) || Object.ReferenceEquals(a, DBNull.Value) || Object.ReferenceEquals(b, null) || Object.ReferenceEquals(b, DBNull.Value)) { // (null, non-null) or (null, DBNull.Value) or vice versa return false; } return (a.Equals(b) || (a.GetType().IsArray && CompareArray((Array)a, b as Array))); } private static bool AreElementEqual(object a, object b) { if (Object.ReferenceEquals(a, b)) { // same reference or (null, null) or (DBNull.Value, DBNull.Value) return true; } if (Object.ReferenceEquals(a, null) || Object.ReferenceEquals(a, DBNull.Value) || Object.ReferenceEquals(b, null) || Object.ReferenceEquals(b, DBNull.Value)) { // (null, non-null) or (null, DBNull.Value) or vice versa return false; } return a.Equals(b); } private static bool CompareArray(Array a, Array b) { if ((null == b) || (1 != a.Rank) || (1 != b.Rank) || (a.Length != b.Length)) { // automatically consider array's with Rank>1 not-equal return false; } int index1 = a.GetLowerBound(0); int index2 = b.GetLowerBound(0); if (a.GetType() == b.GetType() && (0 == index1) && (0 == index2)) { switch (Type.GetTypeCode(a.GetType().GetElementType())) { case TypeCode.Byte: return DataRowComparer.CompareEquatableArray ((Byte[])a, (Byte[])b); case TypeCode.Int16: return DataRowComparer.CompareEquatableArray ((Int16[])a, (Int16[])b); case TypeCode.Int32: return DataRowComparer.CompareEquatableArray ((Int32[])a, (Int32[])b); case TypeCode.Int64: return DataRowComparer.CompareEquatableArray ((Int64[])a, (Int64[])b); case TypeCode.String: return DataRowComparer.CompareEquatableArray ((String[])a, (String[])b); } } //Compare every element. But don't recurse if we have Array of array. int length = index1 + a.Length; for (; index1 < length; ++index1, ++index2) { if (!AreElementEqual(a.GetValue(index1), b.GetValue(index2))) { return false; } } return true; } private static bool CompareEquatableArray (TElem[] a, TElem[] b) where TElem : IEquatable { if (Object.ReferenceEquals(a, b)) { return true; } if (Object.ReferenceEquals(a, null) || Object.ReferenceEquals(b, null)) { return false; } if (a.Length != b.Length) { return false; } for (int i = 0; i < a.Length; ++i) { if (!a[i].Equals(b[i])) { return false; } } return true; } } /// /// This class implements IEqualityComparer using value based semantics /// when comparing DataRows. /// public sealed class DataRowComparer: IEqualityComparer where TRow : DataRow { /// /// Private constructor to prevent initialization outside of Default singleton instance. /// private DataRowComparer() { } private static DataRowComparer_instance = new DataRowComparer (); /// /// Gets the singleton instance of the data row comparer. /// public static DataRowComparerDefault { get { return _instance; } } /// /// This method compares to DataRows by doing a column by column value based /// comparision. /// /// /// The first input DataRow /// /// /// The second input DataRow /// ////// True if rows are equal, false if not. /// public bool Equals(TRow leftRow, TRow rightRow) { if (Object.ReferenceEquals(leftRow, rightRow)) { return true; } if (Object.ReferenceEquals(leftRow, null) || Object.ReferenceEquals(rightRow, null)) { return false; } if (leftRow.RowState == DataRowState.Deleted || rightRow.RowState == DataRowState.Deleted) { throw DataSetUtil.InvalidOperation(Strings.DataSetLinq_CannotCompareDeletedRow); } int count = leftRow.Table.Columns.Count; if (count != rightRow.Table.Columns.Count) { return false; } for (int i = 0; i < count; ++i) { if (!DataRowComparer.AreEqual(leftRow[i], rightRow[i])) { return false; } } return true; } ////// This mtheod retrieves a hash code for the source row. /// /// /// The source DataRow /// ////// HashCode for row based on values in the row. /// public int GetHashCode(TRow row) { DataSetUtil.CheckArgumentNull(row, "row"); if (row.RowState == DataRowState.Deleted) { throw DataSetUtil.InvalidOperation(Strings.DataSetLinq_CannotCompareDeletedRow); } int hash = 0; Debug.Assert(row.Table != null); if (row.Table.Columns.Count > 0) { // if the row has at least one column, then use the first column value object value = row[0]; Type valueType = value.GetType(); if (valueType.IsArray) { Array array = value as Array; if (array.Rank > 1) { hash = value.GetHashCode(); } else if (array.Length > 0) { hash = array.GetValue(array.GetLowerBound(0)).GetHashCode(); } } else { System.ValueType vt = value as System.ValueType; // have to unbox value types. if (vt != null) { hash = vt.GetHashCode(); } else { hash = value.GetHashCode(); } } } // if table has no columns, the hash code is 0 return hash; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //spather //----------------------------------------------------------------------------- using System; using System.Data; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Data.DataSetExtensions; namespace System.Data { ////// This class implements IEqualityComparer using value based semantics /// when comparing DataRows. /// public static class DataRowComparer { ////// Gets the singleton instance of the data row comparer. /// public static DataRowComparerDefault { get { return DataRowComparer .Default; } } internal static bool AreEqual(object a, object b) { if (Object.ReferenceEquals(a, b)) { // same reference or (null, null) or (DBNull.Value, DBNull.Value) return true; } if (Object.ReferenceEquals(a, null) || Object.ReferenceEquals(a, DBNull.Value) || Object.ReferenceEquals(b, null) || Object.ReferenceEquals(b, DBNull.Value)) { // (null, non-null) or (null, DBNull.Value) or vice versa return false; } return (a.Equals(b) || (a.GetType().IsArray && CompareArray((Array)a, b as Array))); } private static bool AreElementEqual(object a, object b) { if (Object.ReferenceEquals(a, b)) { // same reference or (null, null) or (DBNull.Value, DBNull.Value) return true; } if (Object.ReferenceEquals(a, null) || Object.ReferenceEquals(a, DBNull.Value) || Object.ReferenceEquals(b, null) || Object.ReferenceEquals(b, DBNull.Value)) { // (null, non-null) or (null, DBNull.Value) or vice versa return false; } return a.Equals(b); } private static bool CompareArray(Array a, Array b) { if ((null == b) || (1 != a.Rank) || (1 != b.Rank) || (a.Length != b.Length)) { // automatically consider array's with Rank>1 not-equal return false; } int index1 = a.GetLowerBound(0); int index2 = b.GetLowerBound(0); if (a.GetType() == b.GetType() && (0 == index1) && (0 == index2)) { switch (Type.GetTypeCode(a.GetType().GetElementType())) { case TypeCode.Byte: return DataRowComparer.CompareEquatableArray ((Byte[])a, (Byte[])b); case TypeCode.Int16: return DataRowComparer.CompareEquatableArray ((Int16[])a, (Int16[])b); case TypeCode.Int32: return DataRowComparer.CompareEquatableArray ((Int32[])a, (Int32[])b); case TypeCode.Int64: return DataRowComparer.CompareEquatableArray ((Int64[])a, (Int64[])b); case TypeCode.String: return DataRowComparer.CompareEquatableArray ((String[])a, (String[])b); } } //Compare every element. But don't recurse if we have Array of array. int length = index1 + a.Length; for (; index1 < length; ++index1, ++index2) { if (!AreElementEqual(a.GetValue(index1), b.GetValue(index2))) { return false; } } return true; } private static bool CompareEquatableArray (TElem[] a, TElem[] b) where TElem : IEquatable { if (Object.ReferenceEquals(a, b)) { return true; } if (Object.ReferenceEquals(a, null) || Object.ReferenceEquals(b, null)) { return false; } if (a.Length != b.Length) { return false; } for (int i = 0; i < a.Length; ++i) { if (!a[i].Equals(b[i])) { return false; } } return true; } } /// /// This class implements IEqualityComparer using value based semantics /// when comparing DataRows. /// public sealed class DataRowComparer: IEqualityComparer where TRow : DataRow { /// /// Private constructor to prevent initialization outside of Default singleton instance. /// private DataRowComparer() { } private static DataRowComparer_instance = new DataRowComparer (); /// /// Gets the singleton instance of the data row comparer. /// public static DataRowComparerDefault { get { return _instance; } } /// /// This method compares to DataRows by doing a column by column value based /// comparision. /// /// /// The first input DataRow /// /// /// The second input DataRow /// ////// True if rows are equal, false if not. /// public bool Equals(TRow leftRow, TRow rightRow) { if (Object.ReferenceEquals(leftRow, rightRow)) { return true; } if (Object.ReferenceEquals(leftRow, null) || Object.ReferenceEquals(rightRow, null)) { return false; } if (leftRow.RowState == DataRowState.Deleted || rightRow.RowState == DataRowState.Deleted) { throw DataSetUtil.InvalidOperation(Strings.DataSetLinq_CannotCompareDeletedRow); } int count = leftRow.Table.Columns.Count; if (count != rightRow.Table.Columns.Count) { return false; } for (int i = 0; i < count; ++i) { if (!DataRowComparer.AreEqual(leftRow[i], rightRow[i])) { return false; } } return true; } ////// This mtheod retrieves a hash code for the source row. /// /// /// The source DataRow /// ////// HashCode for row based on values in the row. /// public int GetHashCode(TRow row) { DataSetUtil.CheckArgumentNull(row, "row"); if (row.RowState == DataRowState.Deleted) { throw DataSetUtil.InvalidOperation(Strings.DataSetLinq_CannotCompareDeletedRow); } int hash = 0; Debug.Assert(row.Table != null); if (row.Table.Columns.Count > 0) { // if the row has at least one column, then use the first column value object value = row[0]; Type valueType = value.GetType(); if (valueType.IsArray) { Array array = value as Array; if (array.Rank > 1) { hash = value.GetHashCode(); } else if (array.Length > 0) { hash = array.GetValue(array.GetLowerBound(0)).GetHashCode(); } } else { System.ValueType vt = value as System.ValueType; // have to unbox value types. if (vt != null) { hash = vt.GetHashCode(); } else { hash = value.GetHashCode(); } } } // if table has no columns, the hash code is 0 return hash; } } } // 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
- ObjectQueryState.cs
- WebHttpElement.cs
- XmlNavigatorStack.cs
- CollectionViewSource.cs
- TwoPhaseCommitProxy.cs
- WinFormsUtils.cs
- AnchoredBlock.cs
- Viewport2DVisual3D.cs
- ChannelBase.cs
- RelatedView.cs
- RtfControlWordInfo.cs
- SqlDataSourceSelectingEventArgs.cs
- invalidudtexception.cs
- SettingsSavedEventArgs.cs
- JournalEntry.cs
- SystemColors.cs
- ShapeTypeface.cs
- InternalBufferOverflowException.cs
- ThreadLocal.cs
- DataObjectEventArgs.cs
- ResourceExpressionBuilder.cs
- DisplayInformation.cs
- _LoggingObject.cs
- DesignerAdapterUtil.cs
- BufferedReadStream.cs
- WebBrowser.cs
- XmlDataDocument.cs
- XmlSchemaSet.cs
- DPTypeDescriptorContext.cs
- LogicalExpressionEditor.cs
- ConnectionPoolManager.cs
- VersionedStream.cs
- LocalizationComments.cs
- MetadataArtifactLoaderCompositeFile.cs
- ListSortDescription.cs
- thaishape.cs
- ReaderOutput.cs
- DataGridViewCellStyleConverter.cs
- ResolveNameEventArgs.cs
- HtmlHead.cs
- UnmanagedMarshal.cs
- EncoderBestFitFallback.cs
- EventDrivenDesigner.cs
- StrokeNodeData.cs
- SqlRowUpdatingEvent.cs
- XmlSchemaFacet.cs
- SecurityProtocol.cs
- OdbcCommandBuilder.cs
- OutputCacheSection.cs
- TripleDESCryptoServiceProvider.cs
- GridSplitter.cs
- ListBoxItemAutomationPeer.cs
- SelectionList.cs
- MetadataSource.cs
- BamlRecordWriter.cs
- ServiceDurableInstanceContextProvider.cs
- WizardPanelChangingEventArgs.cs
- QueryExpr.cs
- HScrollBar.cs
- SizeIndependentAnimationStorage.cs
- StylusDownEventArgs.cs
- ToolboxDataAttribute.cs
- VisualTreeUtils.cs
- _ConnectionGroup.cs
- PathSegmentCollection.cs
- AnnotationHighlightLayer.cs
- PipeStream.cs
- DataPagerCommandEventArgs.cs
- DataGridColumnHeaderItemAutomationPeer.cs
- ButtonBaseAutomationPeer.cs
- InvalidFilterCriteriaException.cs
- QueueProcessor.cs
- QueryProcessor.cs
- DbCommandTree.cs
- SocketPermission.cs
- RSAPKCS1SignatureDeformatter.cs
- MemberMemberBinding.cs
- ReceiveDesigner.xaml.cs
- SecurityResources.cs
- MobileSysDescriptionAttribute.cs
- HttpContextServiceHost.cs
- ImageConverter.cs
- HMACSHA256.cs
- BindingNavigator.cs
- XamlToRtfWriter.cs
- XmlSchemaException.cs
- TextComposition.cs
- ClassHandlersStore.cs
- ConstNode.cs
- HwndSubclass.cs
- BasicExpandProvider.cs
- HttpHandlerAction.cs
- EnumValAlphaComparer.cs
- TemplateInstanceAttribute.cs
- ClientSponsor.cs
- UserThread.cs
- TreeViewDesigner.cs
- ParallelEnumerable.cs
- StandardCommandToolStripMenuItem.cs
- PageMediaType.cs