using System; using System.Collections.Generic; using System.Text; namespace System.Linq { class OrderByEnumerable : IOrderedEnumerable { public readonly IEnumerable Source; public readonly Func KeySelector; public readonly IComparer Comparer; public readonly bool Descending; public OrderByEnumerable (IEnumerable source, Func keySelector, IComparer comparer, bool descending) { if (source == null) throw new ArgumentNullException ("source"); if (keySelector == null) throw new ArgumentNullException ("keySelector"); Source = source; KeySelector = keySelector; Comparer = comparer ?? Comparer.Default; Descending = descending; } public IOrderedEnumerable CreateOrderedEnumerable ( Func keySelector, IComparer comparer, bool descending) { return new ThenByEnumerable (this, keySelector, comparer, descending); } internal virtual int CompareElements (TElement e1, TElement e2) // ThenByEnumerable will override this method. { int result = Comparer.Compare (KeySelector (e1), KeySelector (e2)); return Descending ? -result : result; } internal virtual IEnumerable GetElementsToSort () // ThenByEnumerable will override this method. { return Source; } public IEnumerator GetEnumerator () { TElement [] array = GetElementsToSort ().ToArray(); Array.Sort (array, CompareElements); foreach (TElement element in array) yield return element; } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator () { return GetEnumerator(); } } }