@@ -33,23 +33,7 @@ internal static MemberGetter<TComponent,TField> Getter(string memberName)
3333internal delegate TField MemberGetter < in TComponent , out TField > ( TComponent component ) ;
3434
3535
36- internal class GenericComparerAsc < TField > : IComparer < ComponentField < TField > >
37- where TField : IComparable < TField >
38- {
39- public int Compare ( ComponentField < TField > e1 , ComponentField < TField > e2 ) {
40- var hasValueDiff = e1 . hasField - e2 . hasField ;
41- return hasValueDiff != 0 ? hasValueDiff : Comparer < TField > . Default . Compare ( e1 . field , e2 . field ) ;
42- }
43- }
44-
45- internal class GenericComparerDesc < TField > : IComparer < ComponentField < TField > >
46- where TField : IComparable < TField >
47- {
48- public int Compare ( ComponentField < TField > e1 , ComponentField < TField > e2 ) {
49- var hasValueDiff = e2 . hasField - e1 . hasField ;
50- return hasValueDiff != 0 ? hasValueDiff : Comparer < TField > . Default . Compare ( e2 . field , e1 . field ) ;
51- }
52- }
36+
5337
5438public struct ComponentField < TField > where TField : IComparable < TField >
5539{
@@ -63,9 +47,38 @@ public override string ToString() {
6347 }
6448 return $ "id: { entityId } , value: { field } ";
6549 }
50+
51+ #if ! NET5_0_OR_GREATER
52+ private class GenericComparerAsc : IComparer < ComponentField < TField > >
53+ {
54+ public int Compare ( ComponentField < TField > e1 , ComponentField < TField > e2 ) {
55+ var hasValueDiff = e1 . hasField - e2 . hasField ;
56+ return hasValueDiff != 0 ? hasValueDiff : Comparer < TField > . Default . Compare ( e1 . field , e2 . field ) ;
57+ }
58+ }
59+
60+ private class GenericComparerDesc : IComparer < ComponentField < TField > >
61+ {
62+ public int Compare ( ComponentField < TField > e1 , ComponentField < TField > e2 ) {
63+ var hasValueDiff = e2 . hasField - e1 . hasField ;
64+ return hasValueDiff != 0 ? hasValueDiff : Comparer < TField > . Default . Compare ( e2 . field , e1 . field ) ;
65+ }
66+ }
67+
68+ private static readonly GenericComparerAsc ComparerAsc = new ( ) ;
69+ private static readonly GenericComparerDesc ComparerDesc = new ( ) ;
70+ #endif
71+
72+ private static readonly Comparison < ComponentField < TField > > ComparisonAsc = ( e1 , e2 ) => {
73+ var hasValueDiff = e1 . hasField - e2 . hasField ;
74+ return hasValueDiff != 0 ? hasValueDiff : Comparer < TField > . Default . Compare ( e1 . field , e2 . field ) ;
75+ } ;
76+
77+ private static readonly Comparison < ComponentField < TField > > ComparisonDesc = ( e1 , e2 ) => {
78+ var hasValueDiff = e2 . hasField - e1 . hasField ;
79+ return hasValueDiff != 0 ? hasValueDiff : Comparer < TField > . Default . Compare ( e2 . field , e1 . field ) ;
80+ } ;
6681
67- private static readonly GenericComparerAsc < TField > ComparerAsc = new GenericComparerAsc < TField > ( ) ;
68- private static readonly GenericComparerDesc < TField > ComparerDesc = new GenericComparerDesc < TField > ( ) ;
6982
7083 internal static ComponentField < TField > [ ] Sort < TComponent > ( EntityList entities , string memberName , SortOrder sortOrder , ComponentField < TField > [ ] fields )
7184 where TComponent : struct , IComponent
@@ -99,10 +112,20 @@ internal static ComponentField<TField>[] Sort<TComponent>(EntityList entities,
99112 case SortOrder . None :
100113 return fields ;
101114 case SortOrder . Ascending :
115+ Span < ComponentField < TField > > span = new Span < ComponentField < TField > > ( fields , 0 , count ) ;
116+ #if NET5_0_OR_GREATER
117+ span . Sort ( ComparisonAsc ) ;
118+ #else
102119 Array . Sort ( fields , 0 , count , ComparerAsc ) ; // allocates a single System.Comparision<ComponentField<>> instance
120+ #endif
103121 break ;
104122 case SortOrder . Descending :
105- Array . Sort ( fields , 0 , count , ComparerDesc ) ; // allocates a single System.Comparision<ComponentField<>> instance
123+ span = new Span < ComponentField < TField > > ( fields , 0 , count ) ;
124+ #if NET5_0_OR_GREATER
125+ span . Sort ( ComparisonDesc ) ;
126+ #else
127+ Array . Sort ( fields , 0 , count , ComparerDesc ) ; // allocates a single System.Comparision<ComponentField<>> instance
128+ #endif
106129 break ;
107130 }
108131 for ( int n = 0 ; n < count ; n ++ ) {
0 commit comments