Example #1
0
        protected virtual List <T> GetFilteredItems(IEnumerable <T> e)
        {
            List <T> objList = new List <T>();

            this.CollectionView.mainThreadId = Thread.CurrentThread.ManagedThreadId;
            if (this.MultithreadedFiltering)
            {
                this.CollectionView.ClearThreadedFilterNodes();
                Thread[] threadArray = new Thread[Environment.ProcessorCount];
                HybridIndex <T> .ThreadedFilteringArgument[] filteringArgumentArray = new HybridIndex <T> .ThreadedFilteringArgument[Environment.ProcessorCount];
                int num = 0;
                foreach (T obj in e)
                {
                    ++num;
                }
                for (int index = 0; index < threadArray.Length; ++index)
                {
                    threadArray[index]            = new Thread(new ParameterizedThreadStart(this.FilterTask));
                    filteringArgumentArray[index] = new HybridIndex <T> .ThreadedFilteringArgument();

                    filteringArgumentArray[index].Enumeration = e;
                    filteringArgumentArray[index].FirstIndex  = index * num / threadArray.Length;
                    filteringArgumentArray[index].LastIndex   = index == threadArray.Length - 1 ? num - 1 : (index + 1) * num / threadArray.Length - 1;
                }
                for (int index = 0; index < threadArray.Length; ++index)
                {
                    threadArray[index].Start((object)filteringArgumentArray[index]);
                }
                for (int index = 0; index < threadArray.Length; ++index)
                {
                    threadArray[index].Join();
                }
                for (int index = 0; index < threadArray.Length; ++index)
                {
                    if (filteringArgumentArray[index].Result != null)
                    {
                        objList.AddRange((IEnumerable <T>)filteringArgumentArray[index].Result);
                    }
                }
            }
            else
            {
                foreach (T obj in e)
                {
                    if (this.CollectionView.PassesFilter(obj))
                    {
                        objList.Add(obj);
                    }
                }
            }
            return(objList);
        }
Example #2
0
        private void FilterTask(object parameter)
        {
            HybridIndex <T> .ThreadedFilteringArgument filteringArgument = parameter as HybridIndex <T> .ThreadedFilteringArgument;
            if (filteringArgument == null)
            {
                return;
            }
            int num = 0;

            filteringArgument.Result = new List <T>();
            foreach (T obj in filteringArgument.Enumeration)
            {
                if (num >= filteringArgument.FirstIndex && num <= filteringArgument.LastIndex && this.CollectionView.PassesFilter(obj))
                {
                    filteringArgument.Result.Add(obj);
                }
                ++num;
            }
        }