diff --git a/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextExtensions.cs b/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextExtensions.cs index a40f12ecbebec..a14da142caf37 100644 --- a/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextExtensions.cs +++ b/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextExtensions.cs @@ -17,14 +17,14 @@ public static IEnumerable GetDefaultNativeAssets(this DependencyContext { ThrowHelper.ThrowIfNull(self); - return self.RuntimeLibraries.SelectMany(library => library.GetDefaultNativeAssets(self)); + return LinqHelpers.SelectMany(self.RuntimeLibraries, static (library, context) => library.GetDefaultNativeAssets(context), self); } public static IEnumerable GetDefaultNativeRuntimeFileAssets(this DependencyContext self) { ThrowHelper.ThrowIfNull(self); - return self.RuntimeLibraries.SelectMany(library => library.GetDefaultNativeRuntimeFileAssets(self)); + return LinqHelpers.SelectMany(self.RuntimeLibraries, static (library, context) => library.GetDefaultNativeRuntimeFileAssets(context), self); } public static IEnumerable GetRuntimeNativeAssets(this DependencyContext self, string runtimeIdentifier) @@ -32,7 +32,7 @@ public static IEnumerable GetRuntimeNativeAssets(this DependencyContext ThrowHelper.ThrowIfNull(self); ThrowHelper.ThrowIfNull(runtimeIdentifier); - return self.RuntimeLibraries.SelectMany(library => library.GetRuntimeNativeAssets(self, runtimeIdentifier)); + return LinqHelpers.SelectMany(self.RuntimeLibraries, static (library, context, id) => library.GetRuntimeNativeAssets(context, id), self, runtimeIdentifier); } public static IEnumerable GetRuntimeNativeRuntimeFileAssets(this DependencyContext self, string runtimeIdentifier) @@ -40,7 +40,7 @@ public static IEnumerable GetRuntimeNativeRuntimeFileAssets(this De ThrowHelper.ThrowIfNull(self); ThrowHelper.ThrowIfNull(runtimeIdentifier); - return self.RuntimeLibraries.SelectMany(library => library.GetRuntimeNativeRuntimeFileAssets(self, runtimeIdentifier)); + return LinqHelpers.SelectMany(self.RuntimeLibraries, static (library, context, id) => library.GetRuntimeNativeRuntimeFileAssets(context, id), self, runtimeIdentifier); } public static IEnumerable GetDefaultNativeAssets(this RuntimeLibrary self, DependencyContext context) @@ -79,7 +79,7 @@ public static IEnumerable GetDefaultAssemblyNames(this DependencyC { ThrowHelper.ThrowIfNull(self); - return self.RuntimeLibraries.SelectMany(library => library.GetDefaultAssemblyNames(self)); + return LinqHelpers.SelectMany(self.RuntimeLibraries, static (library, context) => library.GetDefaultAssemblyNames(context), self); } public static IEnumerable GetRuntimeAssemblyNames(this DependencyContext self, string runtimeIdentifier) @@ -87,7 +87,7 @@ public static IEnumerable GetRuntimeAssemblyNames(this DependencyC ThrowHelper.ThrowIfNull(self); ThrowHelper.ThrowIfNull(runtimeIdentifier); - return self.RuntimeLibraries.SelectMany(library => library.GetRuntimeAssemblyNames(self, runtimeIdentifier)); + return LinqHelpers.SelectMany(self.RuntimeLibraries, static (library, context, id) => library.GetRuntimeAssemblyNames(context, id), self, runtimeIdentifier); } public static IEnumerable GetDefaultAssemblyNames(this RuntimeLibrary self, DependencyContext context) diff --git a/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextJsonReader.cs b/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextJsonReader.cs index a6e80f8921801..c0ff80a6e5a8c 100644 --- a/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextJsonReader.cs +++ b/src/libraries/Microsoft.Extensions.DependencyModel/src/DependencyContextJsonReader.cs @@ -741,9 +741,18 @@ private IEnumerable CreateLibraries(IEnumerable? librari { return Enumerable.Empty(); } - return libraries - .Select(property => CreateLibrary(property, runtime, libraryStubs)) - .Where(library => library != null)!; + + return CreateLibrariesNotNull(libraries, runtime, libraryStubs); + + IEnumerable CreateLibrariesNotNull(IEnumerable libraries, bool runtime, Dictionary? libraryStubs) + { + foreach (TargetLibrary library in libraries) + { + Library? createdLibrary = CreateLibrary(library, runtime, libraryStubs); + if (createdLibrary is not null) + yield return createdLibrary; + } + } } private Library? CreateLibrary(TargetLibrary targetLibrary, bool runtime, Dictionary? libraryStubs) diff --git a/src/libraries/Microsoft.Extensions.DependencyModel/src/LinqHelpers.cs b/src/libraries/Microsoft.Extensions.DependencyModel/src/LinqHelpers.cs new file mode 100644 index 0000000000000..292b5c1888154 --- /dev/null +++ b/src/libraries/Microsoft.Extensions.DependencyModel/src/LinqHelpers.cs @@ -0,0 +1,38 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Microsoft.Extensions.DependencyModel +{ + internal static class LinqHelpers + { + public static IEnumerable SelectMany(IEnumerable src, + Func> func, TParam1 param1) + { + foreach (TSource? elem in src) + { + foreach (TResult? subElem in func(elem, param1)) + { + yield return subElem; + } + } + } + + public static IEnumerable SelectMany(IEnumerable src, + Func> func, TParam1 param1, TParam2 param2) + { + foreach (TSource? elem in src) + { + foreach (TResult? subElem in func(elem, param1, param2)) + { + yield return subElem; + } + } + } + } +}