Files
Toolkit2/Framework/Foundation/Helpers/KeyValueAccumulator.cs
T
2022-12-22 20:31:25 +00:00

66 lines
1.8 KiB
C#

using Microsoft.Extensions.Primitives;
namespace Toolkit.Framework.Foundation;
public struct KeyValueAccumulator
{
private Dictionary<string, StringValues> accumulator;
private Dictionary<string, List<string>> expandingAccumulator;
public void Append(string key, string value)
{
accumulator ??= new Dictionary<string, StringValues>(StringComparer.OrdinalIgnoreCase);
if (accumulator.TryGetValue(key, out StringValues values))
{
if (values.Count == 0)
{
expandingAccumulator[key].Add(value);
}
else if (values.Count == 1)
{
accumulator[key] = new string[] { values[0]!, value };
}
else
{
accumulator[key] = default;
expandingAccumulator ??= new Dictionary<string, List<string>>(StringComparer.OrdinalIgnoreCase);
List<string> list = new(8);
string?[] array = values.ToArray();
list.Add(array[0]!);
list.Add(array[1]!);
list.Add(value);
expandingAccumulator[key] = list;
}
}
else
{
accumulator[key] = new StringValues(value);
}
ValueCount++;
}
public bool HasValues => ValueCount > 0;
public int KeyCount => accumulator?.Count ?? 0;
public int ValueCount { get; private set; }
public Dictionary<string, StringValues> GetResults()
{
if (expandingAccumulator != null)
{
foreach (var entry in expandingAccumulator)
{
accumulator[entry.Key] = new StringValues(entry.Value.ToArray());
}
}
return accumulator ?? new Dictionary<string, StringValues>(0, StringComparer.OrdinalIgnoreCase);
}
}