diff --git a/crates/bindings-csharp/BSATN.Runtime/BSATN/Runtime.cs b/crates/bindings-csharp/BSATN.Runtime/BSATN/Runtime.cs index cd0dfef5866..e3f966eebb2 100644 --- a/crates/bindings-csharp/BSATN.Runtime/BSATN/Runtime.cs +++ b/crates/bindings-csharp/BSATN.Runtime/BSATN/Runtime.cs @@ -403,8 +403,19 @@ public AlgebraicType GetAlgebraicType(ITypeRegistrar registrar) => where ElementRW : IReadWrite, new() { private static readonly Enumerable enumerable = new(); + private static readonly ElementRW elementRW = new(); - public Element[] Read(BinaryReader reader) => enumerable.Read(reader).ToArray(); + public Element[] Read(BinaryReader reader) + { + // Don't use Enumerable here: save an allocation and pre-allocate the output. + var count = reader.ReadInt32(); + var result = new Element[count]; + for (var i = 0; i < count; i++) + { + result[i] = elementRW.Read(reader); + } + return result; + } public void Write(BinaryWriter writer, Element[] value) => enumerable.Write(writer, value); @@ -446,8 +457,19 @@ public AlgebraicType GetAlgebraicType(ITypeRegistrar registrar) => where ElementRW : IReadWrite, new() { private static readonly Enumerable enumerable = new(); + private static readonly ElementRW elementRW = new(); - public List Read(BinaryReader reader) => enumerable.Read(reader).ToList(); + public List Read(BinaryReader reader) + { + // Don't use Enumerable here: save an allocation and pre-allocate the output. + var count = reader.ReadInt32(); + var result = new List(count); + for (var i = 0; i < count; i++) + { + result.Add(elementRW.Read(reader)); + } + return result; + } public void Write(BinaryWriter writer, List value) => enumerable.Write(writer, value);