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 b1d8704fe0cbad..e4cfae88c17e06 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 @@ public static void TryAdd( 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 @@ public static void TryAddEnumerable( 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 @@ public static IServiceCollection Replace( 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);