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); }
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; } }