Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Core / System / Linq / Parallel / Enumerables / AggregationMinMaxHelpers.cs / 1305376 / AggregationMinMaxHelpers.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== // =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ // // AggregationMinMaxHelpers.cs // //[....] // // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- using System.Collections.Generic; using System.Linq.Parallel; using System.Diagnostics.Contracts; namespace System.Linq { internal static class AggregationMinMaxHelpers{ //------------------------------------------------------------------------------------ // Helper method to find the minimum or maximum element in the source. // private static T Reduce(IEnumerable source, int sign) { Contract.Assert(source != null); Contract.Assert(sign == -1 || sign == 1); Func , T, Pair > intermediateReduce = MakeIntermediateReduceFunction(sign); Func , Pair , Pair > finalReduce = MakeFinalReduceFunction(sign); Func , T> resultSelector = MakeResultSelectorFunction(); AssociativeAggregationOperator , T> aggregation = new AssociativeAggregationOperator , T>(source, new Pair (false, default(T)), null, true, intermediateReduce, finalReduce, resultSelector, default(T) != null, QueryAggregationOptions.AssociativeCommutative); return aggregation.Aggregate(); } //----------------------------------------------------------------------------------- // Helper method to find the minimum element in the source. // internal static T ReduceMin(IEnumerable source) { return Reduce(source, -1); } //----------------------------------------------------------------------------------- // Helper method to find the maximum element in the source. // internal static T ReduceMax(IEnumerable source) { return Reduce(source, 1); } //----------------------------------------------------------------------------------- // These methods are used to generate delegates to perform the comparisons. // private static Func , T, Pair > MakeIntermediateReduceFunction(int sign) { Comparer comparer = Util.GetDefaultComparer (); // Note that we capture the 'sign' argument and 'comparer' local, and therefore the C# // compiler will transform this into an instance-based delegate, incurring an extra (hidden) // object allocation. return delegate(Pair accumulator, T element) { // If this is the first element, or the sign of the result of comparing the element with // the existing accumulated result is equal to the sign requested by the function factory, // we will return a new pair that contains the current element as the best item. We will // ignore null elements (for reference and nullable types) in the input stream. if ((default(T) != null || element != null) && (!accumulator.First || Util.Sign(comparer.Compare(element, accumulator.Second)) == sign)) { return new Pair (true, element); } // Otherwise, just return the current accumulator result. return accumulator; }; } private static Func , Pair , Pair > MakeFinalReduceFunction(int sign) { Comparer comparer = Util.GetDefaultComparer (); // Note that we capture the 'sign' argument and 'comparer' local, and therefore the C# // compiler will transform this into an instance-based delegate, incurring an extra (hidden) // object allocation. return delegate(Pair accumulator, Pair element) { // If the intermediate reduction is empty, we will ignore it. Otherwise, if this is the // first element, or the sign of the result of comparing the element with the existing // accumulated result is equal to the sign requested by the function factory, we will // return a new pair that contains the current element as the best item. if (element.First && (!accumulator.First || Util.Sign(comparer.Compare(element.Second, accumulator.Second)) == sign)) { Contract.Assert(default(T) != null || element.Second != null, "nulls unexpected in final reduce"); return new Pair (true, element.Second); } // Otherwise, just return the current accumulator result. return accumulator; }; } private static Func , T> MakeResultSelectorFunction() { // If we saw at least one element in the source stream, the right pair element will contain // the element we're looking for -- so we return that. In the case of non-nullable value // types, the aggregation API will have thrown an exception before calling us for // empty sequences. Else, we will just return the element, which may be null for other types. return delegate(Pair accumulator) { Contract.Assert(accumulator.First || default(T) == null, "for non-null types we expect an exception to be thrown before getting here"); return accumulator.Second; }; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== // =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ // // AggregationMinMaxHelpers.cs // // [....] // // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- using System.Collections.Generic; using System.Linq.Parallel; using System.Diagnostics.Contracts; namespace System.Linq { internal static class AggregationMinMaxHelpers{ //------------------------------------------------------------------------------------ // Helper method to find the minimum or maximum element in the source. // private static T Reduce(IEnumerable source, int sign) { Contract.Assert(source != null); Contract.Assert(sign == -1 || sign == 1); Func , T, Pair > intermediateReduce = MakeIntermediateReduceFunction(sign); Func , Pair , Pair > finalReduce = MakeFinalReduceFunction(sign); Func , T> resultSelector = MakeResultSelectorFunction(); AssociativeAggregationOperator , T> aggregation = new AssociativeAggregationOperator , T>(source, new Pair (false, default(T)), null, true, intermediateReduce, finalReduce, resultSelector, default(T) != null, QueryAggregationOptions.AssociativeCommutative); return aggregation.Aggregate(); } //----------------------------------------------------------------------------------- // Helper method to find the minimum element in the source. // internal static T ReduceMin(IEnumerable source) { return Reduce(source, -1); } //----------------------------------------------------------------------------------- // Helper method to find the maximum element in the source. // internal static T ReduceMax(IEnumerable source) { return Reduce(source, 1); } //----------------------------------------------------------------------------------- // These methods are used to generate delegates to perform the comparisons. // private static Func , T, Pair > MakeIntermediateReduceFunction(int sign) { Comparer comparer = Util.GetDefaultComparer (); // Note that we capture the 'sign' argument and 'comparer' local, and therefore the C# // compiler will transform this into an instance-based delegate, incurring an extra (hidden) // object allocation. return delegate(Pair accumulator, T element) { // If this is the first element, or the sign of the result of comparing the element with // the existing accumulated result is equal to the sign requested by the function factory, // we will return a new pair that contains the current element as the best item. We will // ignore null elements (for reference and nullable types) in the input stream. if ((default(T) != null || element != null) && (!accumulator.First || Util.Sign(comparer.Compare(element, accumulator.Second)) == sign)) { return new Pair (true, element); } // Otherwise, just return the current accumulator result. return accumulator; }; } private static Func , Pair , Pair > MakeFinalReduceFunction(int sign) { Comparer comparer = Util.GetDefaultComparer (); // Note that we capture the 'sign' argument and 'comparer' local, and therefore the C# // compiler will transform this into an instance-based delegate, incurring an extra (hidden) // object allocation. return delegate(Pair accumulator, Pair element) { // If the intermediate reduction is empty, we will ignore it. Otherwise, if this is the // first element, or the sign of the result of comparing the element with the existing // accumulated result is equal to the sign requested by the function factory, we will // return a new pair that contains the current element as the best item. if (element.First && (!accumulator.First || Util.Sign(comparer.Compare(element.Second, accumulator.Second)) == sign)) { Contract.Assert(default(T) != null || element.Second != null, "nulls unexpected in final reduce"); return new Pair (true, element.Second); } // Otherwise, just return the current accumulator result. return accumulator; }; } private static Func , T> MakeResultSelectorFunction() { // If we saw at least one element in the source stream, the right pair element will contain // the element we're looking for -- so we return that. In the case of non-nullable value // types, the aggregation API will have thrown an exception before calling us for // empty sequences. Else, we will just return the element, which may be null for other types. return delegate(Pair accumulator) { Contract.Assert(accumulator.First || default(T) == null, "for non-null types we expect an exception to be thrown before getting here"); return accumulator.Second; }; } } } // 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
- BinHexDecoder.cs
- XmlAttribute.cs
- EntityCodeGenerator.cs
- RelatedEnd.cs
- CommonDialog.cs
- RenamedEventArgs.cs
- NumericUpDownAcceleration.cs
- DomNameTable.cs
- SapiGrammar.cs
- PropertyPathWorker.cs
- SafeEventLogReadHandle.cs
- MemberAssignment.cs
- LogStream.cs
- ISCIIEncoding.cs
- _IPv6Address.cs
- Touch.cs
- Int16KeyFrameCollection.cs
- VarRefManager.cs
- XmlUnspecifiedAttribute.cs
- ComponentCollection.cs
- OutputCacheProfile.cs
- FormViewUpdatedEventArgs.cs
- GcSettings.cs
- Object.cs
- Maps.cs
- ASCIIEncoding.cs
- Shape.cs
- AbstractExpressions.cs
- TraceContext.cs
- CurrentChangingEventManager.cs
- Merger.cs
- ComponentSerializationService.cs
- NavigationProperty.cs
- ThaiBuddhistCalendar.cs
- WebPartConnectionsEventArgs.cs
- DbProviderFactoriesConfigurationHandler.cs
- RenderingEventArgs.cs
- CodeFieldReferenceExpression.cs
- ToolStripPanelDesigner.cs
- SchemaCollectionCompiler.cs
- JoinGraph.cs
- AssemblyInfo.cs
- FloaterParaClient.cs
- FontStyle.cs
- TimeZoneInfo.cs
- XamlReader.cs
- SoapObjectInfo.cs
- ArcSegment.cs
- MasterPageBuildProvider.cs
- UnsafeNativeMethods.cs
- SrgsNameValueTag.cs
- TranslateTransform3D.cs
- HostedHttpTransportManager.cs
- SimpleFileLog.cs
- GetWinFXPath.cs
- SystemUnicastIPAddressInformation.cs
- MonitorWrapper.cs
- AmbientValueAttribute.cs
- UnsafeNativeMethodsPenimc.cs
- SQLSingleStorage.cs
- WebPartCatalogCloseVerb.cs
- SqlSelectStatement.cs
- Stylesheet.cs
- CodeDomExtensionMethods.cs
- DataSourceGeneratorException.cs
- TextEmbeddedObject.cs
- XsltQilFactory.cs
- AsyncPostBackErrorEventArgs.cs
- AdornerLayer.cs
- GridViewPageEventArgs.cs
- CachedPathData.cs
- StrokeNodeOperations.cs
- Literal.cs
- OdbcConnectionStringbuilder.cs
- CollectionViewSource.cs
- HtmlInputImage.cs
- SpellCheck.cs
- OleDbDataReader.cs
- MaskedTextBox.cs
- TextTreeInsertElementUndoUnit.cs
- SystemColors.cs
- ServiceOperationInvoker.cs
- BaseProcessor.cs
- SmtpNtlmAuthenticationModule.cs
- WinInetCache.cs
- EntityDataSourceDesigner.cs
- DataGridDetailsPresenterAutomationPeer.cs
- TrackPointCollection.cs
- EventMemberCodeDomSerializer.cs
- ConfigXmlComment.cs
- ColumnWidthChangingEvent.cs
- BooleanAnimationBase.cs
- DataRowCollection.cs
- ListItemCollection.cs
- ECDiffieHellmanCng.cs
- ProcessModuleDesigner.cs
- RequestCachingSection.cs
- MemberPathMap.cs
- PermissionSetEnumerator.cs
- OdbcStatementHandle.cs