diff --git a/TUnit.Engine/Utilities/ScopedAttributeFilter.cs b/TUnit.Engine/Utilities/ScopedAttributeFilter.cs index 48984d1373..f08ec4007b 100644 --- a/TUnit.Engine/Utilities/ScopedAttributeFilter.cs +++ b/TUnit.Engine/Utilities/ScopedAttributeFilter.cs @@ -1,7 +1,5 @@ -using System.Diagnostics.CodeAnalysis; -using Polyfills; using TUnit.Core; -using TUnit.Engine.Helpers; +using TUnit.Core.Helpers; namespace TUnit.Engine.Utilities; @@ -16,10 +14,10 @@ internal static class ScopedAttributeFilter /// The type of objects to filter /// The collection of items to filter /// A filtered collection with only one instance per scoped attribute type - public static List FilterScopedAttributes(IEnumerable items) where T : class + public static T[] FilterScopedAttributes(IEnumerable items) where T : class { - var result = new List(); - var scopedAttributesByType = new Dictionary(); + var vlb = new ValueListBuilder([null,null,null,null]); + Dictionary? scopedAttributesByType = null; // First pass: collect all scoped attributes, keeping only the first occurrence of each type foreach (var item in items) @@ -31,17 +29,26 @@ public static List FilterScopedAttributes(IEnumerable items) where T : if (item is IScopedAttribute scopedAttribute) { + scopedAttributesByType ??= new Dictionary(); scopedAttributesByType.TryAdd(scopedAttribute.ScopeType, item); } else { // Not a scoped attribute, include it immediately - result.Add(item); + vlb.Append(item); } } - result.AddRange(scopedAttributesByType.Values); + if (scopedAttributesByType != null) + { + foreach (var value in scopedAttributesByType.Values) + { + vlb.Append(value); + } + } + var result = vlb.AsSpan().ToArray(); + vlb.Dispose(); return result; } }