public void Sort <TComparer> (TComparer comparer, int[] indices = null) where TComparer : IRefComparer <T> { if (_HasList) { if (indices != null) { Items.IndexedSortRef(comparer, indices); } else { Items.FastCLRSortRef(comparer); } return; } if (_Count <= 1) { return; } T a, b; if (comparer.Compare(ref Item1, ref Item2) <= 0) { a = Item1; b = Item2; } else { a = Item2; b = Item1; } if (_Count == 2) { Item1 = a; Item2 = b; return; } else if (_Count == 3) { if (comparer.Compare(ref b, ref Item3) <= 0) { Item1 = a; Item2 = b; } else if (comparer.Compare(ref a, ref Item3) <= 0) { Item1 = a; Item2 = Item3; Item3 = b; } else { Item1 = Item3; Item2 = a; Item3 = b; } } else { T c, d; if (comparer.Compare(ref Item3, ref Item4) <= 0) { c = Item3; d = Item4; } else { c = Item4; d = Item3; } T m1; if (comparer.Compare(ref a, ref c) <= 0) { Item1 = a; m1 = c; } else { Item1 = c; m1 = a; } T m2; if (comparer.Compare(ref b, ref d) >= 0) { Item4 = b; m2 = d; } else { Item4 = d; m2 = b; } if (comparer.Compare(ref m1, ref m2) <= 0) { Item2 = m1; Item3 = m2; } else { Item2 = m2; Item3 = m1; } } }