| File: src\aspnetcore\src\Shared\RoslynUtils\IncrementalValuesProviderExtensions.cs | Web Access |
| Project: src\aspnetcore\src\Http\Http.Extensions\gen\Microsoft.AspNetCore.Http.RequestDelegateGenerator\Microsoft.AspNetCore.Http.RequestDelegateGenerator.csproj (Microsoft.AspNetCore.Http.RequestDelegateGenerator) |
// 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.Collections.Immutable; using Microsoft.CodeAnalysis; internal static class IncrementalValuesProviderExtensions { public static IncrementalValuesProvider<(TSource Source, int Index, ImmutableArray<TElement> Elements)> GroupWith<TSource, TElement>( this IncrementalValuesProvider<TSource> source, Func<TSource, TElement> sourceToElementTransform, IEqualityComparer<TSource> comparer) { return source.Collect().SelectMany((values, _) => { Dictionary<TSource, ImmutableArray<TElement>.Builder> map = new(comparer); foreach (var value in values) { if (!map.TryGetValue(value, out ImmutableArray<TElement>.Builder builder)) { builder = ImmutableArray.CreateBuilder<TElement>(); map.Add(value, builder); } builder.Add(sourceToElementTransform(value)); } ImmutableArray<(TSource Key, int Index, ImmutableArray<TElement> Elements)>.Builder result = ImmutableArray.CreateBuilder<(TSource, int, ImmutableArray<TElement>)>(); var index = 0; foreach (var entry in map) { result.Add((entry.Key, index, entry.Value.ToImmutable())); index++; } return result; }); } }