Code:
/ 4.0 / 4.0 / untmp / 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.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ProfileParameter.cs
- WeakHashtable.cs
- ScrollProperties.cs
- IndividualDeviceConfig.cs
- UIElementParagraph.cs
- XmlKeywords.cs
- TypeUsage.cs
- MatrixAnimationUsingPath.cs
- DBSchemaTable.cs
- DocumentProperties.cs
- Cursor.cs
- InheritedPropertyChangedEventArgs.cs
- EmbeddedMailObjectsCollection.cs
- MultilineStringConverter.cs
- AffineTransform3D.cs
- CollectionViewGroupRoot.cs
- ContractComponent.cs
- HttpServerVarsCollection.cs
- TableColumn.cs
- XamlGridLengthSerializer.cs
- OrthographicCamera.cs
- PropertyEmitter.cs
- coordinatorscratchpad.cs
- ChangePasswordDesigner.cs
- HtmlInputSubmit.cs
- CategoryValueConverter.cs
- CompilationUnit.cs
- XmlHierarchyData.cs
- WithStatement.cs
- GetUserPreferenceRequest.cs
- PropertyMetadata.cs
- WebBrowserNavigatingEventHandler.cs
- CommonDialog.cs
- SerializationInfoEnumerator.cs
- securitycriticaldataClass.cs
- TypeInitializationException.cs
- OpCodes.cs
- ObjectDataSourceEventArgs.cs
- CustomLineCap.cs
- CheckBoxStandardAdapter.cs
- WebResourceAttribute.cs
- elementinformation.cs
- ServiceMoniker.cs
- ServiceMemoryGates.cs
- FrugalMap.cs
- ADMembershipUser.cs
- BindingExpressionBase.cs
- CustomAssemblyResolver.cs
- ActivityAction.cs
- Journaling.cs
- SqlHelper.cs
- WindowsEditBoxRange.cs
- Rectangle.cs
- WindowsToolbarAsMenu.cs
- DataGridViewColumnCollectionEditor.cs
- WinEventQueueItem.cs
- WorkflowApplicationIdleEventArgs.cs
- ProxyHwnd.cs
- ServiceDescriptions.cs
- SoapParser.cs
- BinaryFormatterSinks.cs
- MD5CryptoServiceProvider.cs
- TriggerBase.cs
- CodeAttributeArgumentCollection.cs
- TreeIterator.cs
- ColumnHeaderCollectionEditor.cs
- CaseInsensitiveHashCodeProvider.cs
- Compiler.cs
- WebPartUserCapability.cs
- DesignUtil.cs
- SerializableAttribute.cs
- EUCJPEncoding.cs
- TemplateNameScope.cs
- Tag.cs
- MouseActionValueSerializer.cs
- ExtendedPropertyDescriptor.cs
- FontInfo.cs
- StructuralObject.cs
- PropertyIdentifier.cs
- RenderData.cs
- XmlSchemaChoice.cs
- ItemsControl.cs
- ObservableDictionary.cs
- Light.cs
- TextAdaptor.cs
- Rules.cs
- OrderByBuilder.cs
- RawStylusSystemGestureInputReport.cs
- ControlBindingsCollection.cs
- WebPartEventArgs.cs
- XmlSchemaInclude.cs
- WmlImageAdapter.cs
- ConfigurationCollectionAttribute.cs
- FrameworkReadOnlyPropertyMetadata.cs
- FixedSOMPageConstructor.cs
- ApplicationTrust.cs
- SlotInfo.cs
- ControlValuePropertyAttribute.cs
- Odbc32.cs
- DNS.cs