OrderedEnumerable<T, K>
using Newtonsoft.Json.Serialization;
using System;
using System.Collections;
using System.Collections.Generic;
namespace Newtonsoft.Json.Utilities.LinqBridge
{
internal sealed class OrderedEnumerable<T, K> : IOrderedEnumerable<T>, IEnumerable<T>, IEnumerable
{
private readonly IEnumerable<T> _source;
private readonly List<Comparison<T>> _comparisons;
public OrderedEnumerable(IEnumerable<T> source, Newtonsoft.Json.Serialization.Func<T, K> keySelector, IComparer<K> comparer, bool descending)
: this(source, (List<Comparison<T>>)null, keySelector, comparer, descending)
{
}
private OrderedEnumerable(IEnumerable<T> source, List<Comparison<T>> comparisons, Newtonsoft.Json.Serialization.Func<T, K> keySelector, IComparer<K> comparer, bool descending)
{
if (source == null)
throw new ArgumentNullException("source");
if (keySelector == null)
throw new ArgumentNullException("keySelector");
_source = source;
comparer = (comparer ?? Comparer<K>.Default);
if (comparisons == null)
comparisons = new List<Comparison<T>>(4);
comparisons.Add((T x, T y) => ((!descending) ? 1 : (-1)) * comparer.Compare(keySelector(x), keySelector(y)));
_comparisons = comparisons;
}
public IOrderedEnumerable<T> CreateOrderedEnumerable<KK>(Newtonsoft.Json.Serialization.Func<T, KK> keySelector, IComparer<KK> comparer, bool descending)
{
return new OrderedEnumerable<T, KK>(this._source, this._comparisons, keySelector, comparer, descending);
}
public IEnumerator<T> GetEnumerator()
{
List<Tuple<T, int>> list = Enumerable.ToList<Tuple<T, int>>(Enumerable.Select<T, Tuple<T, int>>(_source, (Newtonsoft.Json.Serialization.Func<T, int, Tuple<T, int>>)TagPosition));
list.Sort(delegate(Tuple<T, int> x, Tuple<T, int> y) {
List<Comparison<T>> comparisons = _comparisons;
for (int i = 0; i < comparisons.Count; i++) {
int num = comparisons[i](x.First, y.First);
if (num != 0)
return num;
}
return x.Second.CompareTo(y.Second);
});
return Enumerable.Select<Tuple<T, int>, T>((IEnumerable<Tuple<T, int>>)list, (Newtonsoft.Json.Serialization.Func<Tuple<T, int>, T>)GetFirst).GetEnumerator();
}
private static Tuple<T, int> TagPosition(T e, int i)
{
return new Tuple<T, int>(e, i);
}
private static T GetFirst(Tuple<T, int> pv)
{
return pv.First;
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
}