3
3
* Licensing: MIT https://github.com/electricessence/Genetic-Algorithm-Platform/blob/master/LICENSE.md
4
4
*/
5
5
6
- using Open . Memory ;
7
6
using System ;
8
7
using System . Buffers ;
9
8
using System . Collections . Generic ;
@@ -165,16 +164,23 @@ public static int RandomSelectIndex<T>(this in ReadOnlySpan<T> source, Random? r
165
164
return RandomSelectIndexExcept ( in source , random , exclusionSet . Single ( ) ) ;
166
165
167
166
var count = source . Length ;
168
- using var temp = ArrayPool < int > . Shared . RentDisposable ( count ) ;
169
- var indexes = temp . Array ;
170
- var indexCount = 0 ;
171
- for ( var i = 0 ; i < count ; ++ i )
167
+ var pool = ArrayPool < int > . Shared ;
168
+ var indexes = pool . Rent ( count ) ;
169
+ try
172
170
{
173
- if ( ! exclusionSet . Contains ( source [ i ] ) )
174
- indexes [ indexCount ++ ] = i ;
171
+ var indexCount = 0 ;
172
+ for ( var i = 0 ; i < count ; ++ i )
173
+ {
174
+ if ( ! exclusionSet . Contains ( source [ i ] ) )
175
+ indexes [ indexCount ++ ] = i ;
176
+ }
177
+ return indexCount == 0 ? - 1
178
+ : indexes [ ( random ?? R . Value ) . Next ( indexCount ) ] ;
179
+ }
180
+ finally
181
+ {
182
+ pool . Return ( indexes ) ;
175
183
}
176
- return indexCount == 0 ? - 1
177
- : indexes [ ( random ?? R . Value ) . Next ( indexCount ) ] ;
178
184
}
179
185
finally
180
186
{
@@ -211,18 +217,26 @@ public static int RandomSelectIndexExcept<T>(this in ReadOnlySpan<T> source, Ran
211
217
if ( others . Length != 0 )
212
218
return RandomSelectIndex ( in source , random , Combined ( excluding , others ) ) ;
213
219
214
- using var temp = ArrayPool < int > . Shared . RentDisposable ( others . Length ) ;
215
- var indexes = temp . Array ;
216
- var i = - 1 ;
217
- var indexCount = 0 ;
218
- foreach ( var value in source )
220
+ var pool = ArrayPool < int > . Shared ;
221
+ var indexes = pool . Rent ( others . Length ) ;
222
+ try
223
+ {
224
+ var i = - 1 ;
225
+ var indexCount = 0 ;
226
+ foreach ( var value in source )
227
+ {
228
+ ++ i ;
229
+ bool equals = excluding is null ? value is null : excluding . Equals ( value ) ;
230
+ if ( ! equals )
231
+ indexes [ indexCount ++ ] = i ;
232
+ }
233
+ return indexCount == 0 ? - 1 : indexes [ R . Value . Next ( indexCount ) ] ;
234
+ }
235
+ finally
219
236
{
220
- ++ i ;
221
- bool equals = excluding is null ? value is null : excluding . Equals ( value ) ;
222
- if ( ! equals )
223
- indexes [ indexCount ++ ] = i ;
237
+ pool . Return ( indexes ) ;
224
238
}
225
- return indexCount == 0 ? - 1 : indexes [ R . Value . Next ( indexCount ) ] ;
239
+
226
240
}
227
241
228
242
/// <summary>
@@ -302,17 +316,25 @@ static int RandomSelectIndex<T>(Random? random, int count, IEnumerable<T> source
302
316
if ( exclusionSet . Count == 1 )
303
317
return RandomSelectIndexExcept ( random , count , source , exclusionSet . Single ( ) ) ;
304
318
305
- using var indexesTemp = ArrayPool < int > . Shared . RentDisposable ( count ) ;
306
- var indexes = indexesTemp . Array ;
307
- var i = - 1 ;
308
- var indexCount = 0 ;
309
- foreach ( var value in source )
319
+ var pool = ArrayPool < int > . Shared ;
320
+ var indexes = pool . Rent ( count ) ;
321
+ try
310
322
{
311
- ++ i ;
312
- if ( ! exclusionSet . Contains ( value ) )
313
- indexes [ indexCount ++ ] = i ;
323
+
324
+ var i = - 1 ;
325
+ var indexCount = 0 ;
326
+ foreach ( var value in source )
327
+ {
328
+ ++ i ;
329
+ if ( ! exclusionSet . Contains ( value ) )
330
+ indexes [ indexCount ++ ] = i ;
331
+ }
332
+ return indexCount == 0 ? - 1 : indexes [ ( random ?? R . Value ) . Next ( indexCount ) ] ;
333
+ }
334
+ finally
335
+ {
336
+ pool . Return ( indexes ) ;
314
337
}
315
- return indexCount == 0 ? - 1 : indexes [ ( random ?? R . Value ) . Next ( indexCount ) ] ;
316
338
}
317
339
finally
318
340
{
@@ -328,18 +350,26 @@ static int RandomSelectIndexExcept<T>(Random? random, int count, IEnumerable<T>
328
350
if ( others . Length != 0 )
329
351
RandomSelectIndex ( random , count , source , Combined ( excluding , others ) ) ;
330
352
331
- using var indexesTemp = ArrayPool < int > . Shared . RentDisposable ( count ) ;
332
- var indexes = indexesTemp . Array ;
333
- var i = - 1 ;
334
- var indexCount = 0 ;
335
- foreach ( var value in source )
353
+ var pool = ArrayPool < int > . Shared ;
354
+ var indexes = pool . Rent ( count ) ;
355
+ try
356
+ {
357
+ var i = - 1 ;
358
+ var indexCount = 0 ;
359
+ foreach ( var value in source )
360
+ {
361
+ ++ i ;
362
+ bool equals = excluding is null ? value is null : excluding . Equals ( value ) ;
363
+ if ( ! equals )
364
+ indexes [ indexCount ++ ] = i ;
365
+ }
366
+ return indexCount == 0 ? - 1 : indexes [ R . Value . Next ( indexCount ) ] ;
367
+ }
368
+ finally
336
369
{
337
- ++ i ;
338
- bool equals = excluding is null ? value is null : excluding . Equals ( value ) ;
339
- if ( ! equals )
340
- indexes [ indexCount ++ ] = i ;
370
+ pool . Return ( indexes ) ;
341
371
}
342
- return indexCount == 0 ? - 1 : indexes [ R . Value . Next ( indexCount ) ] ;
372
+
343
373
}
344
374
345
375
/// <summary>
@@ -629,7 +659,7 @@ public static bool TryRandomSelectOneExcept<T>(
629
659
return false ;
630
660
}
631
661
632
- value = GetElementAt ( source , index ) ;
662
+ value = GetElementAt ( source , index ) ;
633
663
634
664
return true ;
635
665
}
@@ -778,19 +808,25 @@ public static ushort NextExcluding(this Random source,
778
808
if ( exclusionSet == null || exclusionSet . Count == 0 )
779
809
return ( ushort ) source . Next ( range ) ;
780
810
781
- using var indexesTemp = ArrayPool < ushort > . Shared . RentDisposable ( range ) ;
782
- var indexes = indexesTemp . Array ;
783
-
784
- var indexCount = 0 ;
785
- for ( ushort i = 0 ; i < range ; ++ i )
811
+ var pool = ArrayPool < ushort > . Shared ;
812
+ var indexes = pool . Rent ( range ) ;
813
+ try
786
814
{
787
- if ( ! exclusionSet . Contains ( i ) )
788
- indexes [ indexCount ++ ] = i ;
815
+ var indexCount = 0 ;
816
+ for ( ushort i = 0 ; i < range ; ++ i )
817
+ {
818
+ if ( ! exclusionSet . Contains ( i ) )
819
+ indexes [ indexCount ++ ] = i ;
820
+ }
821
+ if ( indexCount == 0 )
822
+ throw new InvalidOperationException ( "Exclusion set invalidates the source. No possible value can be selected." ) ;
823
+
824
+ return indexes [ source . Next ( indexCount ) ] ;
825
+ }
826
+ finally
827
+ {
828
+ pool . Return ( indexes ) ;
789
829
}
790
- if ( indexCount == 0 )
791
- throw new InvalidOperationException ( "Exclusion set invalidates the source. No possible value can be selected." ) ;
792
-
793
- return indexes [ source . Next ( indexCount ) ] ;
794
830
}
795
831
finally
796
832
{
@@ -820,17 +856,25 @@ public static int NextExcluding(this Random source,
820
856
if ( exclusionSet == null || exclusionSet . Count == 0 )
821
857
return source . Next ( range ) ;
822
858
823
- using var indexesTemp = ArrayPool < int > . Shared . RentDisposable ( range ) ;
824
- var indexes = indexesTemp . Array ;
825
- var indexCount = 0 ;
826
- for ( var i = 0 ; i < range ; ++ i )
859
+ var pool = ArrayPool < int > . Shared ;
860
+ var indexes = pool . Rent ( range ) ;
861
+ try
827
862
{
828
- if ( ! exclusionSet . Contains ( i ) )
829
- indexes [ indexCount ++ ] = i ;
863
+ var indexCount = 0 ;
864
+ for ( var i = 0 ; i < range ; ++ i )
865
+ {
866
+ if ( ! exclusionSet . Contains ( i ) )
867
+ indexes [ indexCount ++ ] = i ;
868
+ }
869
+ if ( indexCount == 0 )
870
+ throw new InvalidOperationException ( "Exclusion set invalidates the source. No possible value can be selected." ) ;
871
+ return indexes [ source . Next ( indexCount ) ] ;
830
872
}
831
- if ( indexCount == 0 )
832
- throw new InvalidOperationException ( "Exclusion set invalidates the source. No possible value can be selected." ) ;
833
- return indexes [ source . Next ( indexCount ) ] ;
873
+ finally
874
+ {
875
+ pool . Return ( indexes ) ;
876
+ }
877
+
834
878
}
835
879
finally
836
880
{
0 commit comments