ArrayMergeHelper.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Core / System / Linq / Parallel / Merging / ArrayMergeHelper.cs / 1305376 / ArrayMergeHelper.cs

                            // ==++== 
//
//   Copyright (c) Microsoft Corporation.  All rights reserved.
//
// ==--== 
// =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
// 
// ArrayMergeHelper.cs 
//
// [....] 
//
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 
using System;
using System.Collections.Generic; 
using System.Linq; 
using System.Text;
using System.Linq.Parallel; 
using System.Diagnostics;
using System.Threading.Tasks;

namespace System.Linq.Parallel 
{
    ///  
    /// A special merge helper for indexible queries. Given an indexible query, we know how many elements 
    /// we'll have in the result set, so we can allocate the array ahead of time. Then, as each result element
    /// is produced, we can directly insert it into the appropriate position in the output array, paying 
    /// no extra cost for ordering.
    /// 
    /// 
    internal class ArrayMergeHelper : IMergeHelper 
    {
        private QueryResults m_queryResults; // Indexible query results 
        private TInputOutput[] m_outputArray; // The output array. 
        private QuerySettings m_settings; // Settings for the query.
 
        /// 
        /// Instantiates the array merge helper.
        /// 
        /// The query settings 
        /// The query results
        public ArrayMergeHelper(QuerySettings settings, QueryResults queryResults) 
        { 
            m_settings = settings;
            m_queryResults = queryResults; 

            int count = m_queryResults.Count;
            m_outputArray = new TInputOutput[count];
        } 

        ///  
        /// A method used as a delegate passed into the ForAll operator 
        /// 
        private void ToArrayElement(int index) 
        {
            m_outputArray[index] = m_queryResults[index];
        }
 

        ///  
        /// Schedules execution of the merge itself. 
        /// 
        public void Execute() 
        {
            ParallelQuery query = ParallelEnumerable.Range(0, m_queryResults.Count);
            query = new QueryExecutionOption(QueryOperator.AsQueryOperator(query), m_settings);
            query.ForAll(ToArrayElement); 
        }
 
        ///  
        /// Gets the enumerator over the results.
        /// 
        /// We never expect this method to be called. ArrayMergeHelper is intended to be used when we want
        /// to consume the results using GetResultsAsArray().
        /// 
        public IEnumerator GetEnumerator() 
        {
            Debug.Assert(false, "ArrayMergeHelper<>.GetEnumerator() is not intended to be used. Call GetResultsAsArray() instead."); 
            return ((IEnumerable)GetResultsAsArray()).GetEnumerator(); 
        }
 
        /// 
        /// Returns the merged results as an array.
        /// 
        ///  
        public TInputOutput[] GetResultsAsArray()
        { 
            Debug.Assert(m_outputArray != null); 
            return m_outputArray;
        } 
    }
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// ==++== 
//
//   Copyright (c) Microsoft Corporation.  All rights reserved.
//
// ==--== 
// =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
// 
// ArrayMergeHelper.cs 
//
// [....] 
//
//
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 
using System;
using System.Collections.Generic; 
using System.Linq; 
using System.Text;
using System.Linq.Parallel; 
using System.Diagnostics;
using System.Threading.Tasks;

namespace System.Linq.Parallel 
{
    ///  
    /// A special merge helper for indexible queries. Given an indexible query, we know how many elements 
    /// we'll have in the result set, so we can allocate the array ahead of time. Then, as each result element
    /// is produced, we can directly insert it into the appropriate position in the output array, paying 
    /// no extra cost for ordering.
    /// 
    /// 
    internal class ArrayMergeHelper : IMergeHelper 
    {
        private QueryResults m_queryResults; // Indexible query results 
        private TInputOutput[] m_outputArray; // The output array. 
        private QuerySettings m_settings; // Settings for the query.
 
        /// 
        /// Instantiates the array merge helper.
        /// 
        /// The query settings 
        /// The query results
        public ArrayMergeHelper(QuerySettings settings, QueryResults queryResults) 
        { 
            m_settings = settings;
            m_queryResults = queryResults; 

            int count = m_queryResults.Count;
            m_outputArray = new TInputOutput[count];
        } 

        ///  
        /// A method used as a delegate passed into the ForAll operator 
        /// 
        private void ToArrayElement(int index) 
        {
            m_outputArray[index] = m_queryResults[index];
        }
 

        ///  
        /// Schedules execution of the merge itself. 
        /// 
        public void Execute() 
        {
            ParallelQuery query = ParallelEnumerable.Range(0, m_queryResults.Count);
            query = new QueryExecutionOption(QueryOperator.AsQueryOperator(query), m_settings);
            query.ForAll(ToArrayElement); 
        }
 
        ///  
        /// Gets the enumerator over the results.
        /// 
        /// We never expect this method to be called. ArrayMergeHelper is intended to be used when we want
        /// to consume the results using GetResultsAsArray().
        /// 
        public IEnumerator GetEnumerator() 
        {
            Debug.Assert(false, "ArrayMergeHelper<>.GetEnumerator() is not intended to be used. Call GetResultsAsArray() instead."); 
            return ((IEnumerable)GetResultsAsArray()).GetEnumerator(); 
        }
 
        /// 
        /// Returns the merged results as an array.
        /// 
        ///  
        public TInputOutput[] GetResultsAsArray()
        { 
            Debug.Assert(m_outputArray != null); 
            return m_outputArray;
        } 
    }
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK