From 7426c10456fb198fb27ef0ba27a4340a3f816de8 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Wed, 18 Nov 2020 19:25:34 +0000 Subject: [PATCH] Remove closure allocations from ServiceCollectionDescriptorExtensions (#44696) --- .../ServiceCollectionDescriptorExtensions.cs | 38 ++++++++++++++++------ 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/src/libraries/Microsoft.Extensions.DependencyInjection.Abstractions/src/Extensions/ServiceCollectionDescriptorExtensions.cs b/src/libraries/Microsoft.Extensions.DependencyInjection.Abstractions/src/Extensions/ServiceCollectionDescriptorExtensions.cs index b1d8704..e4cfae8 100644 --- a/src/libraries/Microsoft.Extensions.DependencyInjection.Abstractions/src/Extensions/ServiceCollectionDescriptorExtensions.cs +++ b/src/libraries/Microsoft.Extensions.DependencyInjection.Abstractions/src/Extensions/ServiceCollectionDescriptorExtensions.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; -using System.Linq; namespace Microsoft.Extensions.DependencyInjection.Extensions { @@ -85,10 +84,17 @@ namespace Microsoft.Extensions.DependencyInjection.Extensions throw new ArgumentNullException(nameof(descriptor)); } - if (!collection.Any(d => d.ServiceType == descriptor.ServiceType)) + int count = collection.Count; + for (int i = 0; i < count; i++) { - collection.Add(descriptor); + if (collection[i].ServiceType == descriptor.ServiceType) + { + // Already added + return; + } } + + collection.Add(descriptor); } /// @@ -608,12 +614,19 @@ namespace Microsoft.Extensions.DependencyInjection.Extensions nameof(descriptor)); } - if (!services.Any(d => - d.ServiceType == descriptor.ServiceType && - d.GetImplementationType() == implementationType)) + int count = services.Count; + for (int i = 0; i < count; i++) { - services.Add(descriptor); + ServiceDescriptor service = services[i]; + if (service.ServiceType == descriptor.ServiceType && + service.GetImplementationType() == implementationType) + { + // Already added + return; + } } + + services.Add(descriptor); } /// @@ -674,10 +687,15 @@ namespace Microsoft.Extensions.DependencyInjection.Extensions throw new ArgumentNullException(nameof(descriptor)); } - ServiceDescriptor? registeredServiceDescriptor = collection.FirstOrDefault(s => s.ServiceType == descriptor.ServiceType); - if (registeredServiceDescriptor != null) + // Remove existing + int count = collection.Count; + for (int i = 0; i < count; i++) { - collection.Remove(registeredServiceDescriptor); + if (collection[i].ServiceType == descriptor.ServiceType) + { + collection.RemoveAt(i); + break; + } } collection.Add(descriptor); -- 2.7.4