1 people like it.
Like the snippet!
Faster Filter 2
Another faster filter. Faster in almost all circumstances for sufficiently simple predicates. Not as fast as http://www.fssnip.net/7Qp but does not require the hacky ThreadLocal ResizeArray.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:

let inline filter (f: ^T > bool) (array: ( ^T)[]) =
if array = null then invalidArg "array" "Array can not be null."
if array.Length = 0 then invalidArg "array" "Array can not be empty."
let mutable count = 0
for i = 0 to array.Length1 do
if f array.[i] then
count < count + 1
let result = Array.zeroCreate count
let mutable j = 0
for i = 0 to array.Length1 do
if f array.[i] then
result.[j] < array.[i]
j < j + 1
result

val filter : f:('T > bool) > array:'T [] > 'T [] (requires equality)
Full name: Script.filter
val f : ('T > bool) (requires equality)
type bool = System.Boolean
Full name: Microsoft.FSharp.Core.bool
Multiple items
val array : 'T [] (requires equality)

type 'T array = 'T []
Full name: Microsoft.FSharp.Core.array<_>
val invalidArg : argumentName:string > message:string > 'T
Full name: Microsoft.FSharp.Core.Operators.invalidArg
property System.Array.Length: int
val mutable count : int
val i : int
val result : 'T [] (requires equality)
module Array
from Microsoft.FSharp.Collections
val zeroCreate : count:int > 'T []
Full name: Microsoft.FSharp.Collections.Array.zeroCreate
val mutable j : int
More information