Exemple #1
0
        internal override EnumerableSorter <TElement> GetEnumerableSorter(EnumerableSorter <TElement>?next)
        {
            EnumerableSorter <TElement> sorter = new EnumerableSorter <TElement, TKey>(_keySelector, _comparer, _descending, next);

            if (_parent != null)
            {
                sorter = _parent.GetEnumerableSorter(sorter);
            }

            return(sorter);
        }
            public IEnumerator GetEnumerator()
            {
                Buffer buffer = new Buffer(this.source);

                if (buffer.count > 0)
                {
                    EnumerableSorter sorter = GetEnumerableSorter(null);
                    int[]            map    = sorter.Sort(buffer.items, buffer.count);
                    for (int i = 0; i < buffer.count; i++)
                    {
                        yield return(buffer.items[map[i]]);
                    }
                }
            }
Exemple #3
0
        internal override EnumerableSorter <TElement> GetEnumerableSorter(EnumerableSorter <TElement>?next)
        {
            // Special case the common use of string with default comparer. Comparer<string>.Default checks the
            // thread's Culture on each call which is an overhead which is not required, because we are about to
            // do a sort which remains on the current thread (and EnumerableSorter is not used afterwards).
            IComparer <TKey> comparer = _comparer;

            if (typeof(TKey) == typeof(string) && comparer == Comparer <string> .Default)
            {
                comparer = (IComparer <TKey>)StringComparer.CurrentCulture;
            }

            EnumerableSorter <TElement> sorter = new EnumerableSorter <TElement, TKey>(_keySelector, comparer, _descending, next);

            if (_parent != null)
            {
                sorter = _parent.GetEnumerableSorter(sorter);
            }

            return(sorter);
        }
 internal abstract EnumerableSorter GetEnumerableSorter(EnumerableSorter next);