Skip to content

Commit 34023ff

Browse files
authored
Reduce enumerator boxing in CollectionExtensions (#7950)
1 parent baa8f63 commit 34023ff

File tree

1 file changed

+40
-3
lines changed

1 file changed

+40
-3
lines changed

src/Nethermind/Nethermind.Core/Collections/CollectionExtensions.cs

+40-3
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.Collections.Generic;
77
using System.Linq.Expressions;
88
using System.Reflection;
9+
using System.Runtime.CompilerServices;
910

1011
namespace Nethermind.Core.Collections
1112
{
@@ -15,13 +16,49 @@ public static class CollectionExtensions
1516

1617
public static void AddRange<T>(this ICollection<T> list, IEnumerable<T> items)
1718
{
18-
foreach (T item in items)
19+
if (items is T[] array)
1920
{
20-
list.Add(item);
21+
list.AddRange(array);
22+
}
23+
else if (items is IList<T> listItems)
24+
{
25+
list.AddRange(listItems);
26+
}
27+
else if (items is IReadOnlyList<T> readOnlyList)
28+
{
29+
list.AddRange(readOnlyList);
30+
}
31+
else
32+
{
33+
foreach (T item in items)
34+
{
35+
list.Add(item);
36+
}
37+
}
38+
}
39+
40+
[OverloadResolutionPriority(2)]
41+
public static void AddRange<T>(this ICollection<T> list, IList<T> items)
42+
{
43+
int count = items.Count;
44+
for (int index = 0; index < count; index++)
45+
{
46+
list.Add(items[index]);
47+
}
48+
}
49+
50+
[OverloadResolutionPriority(1)]
51+
public static void AddRange<T>(this ICollection<T> list, IReadOnlyList<T> items)
52+
{
53+
int count = items.Count;
54+
for (int index = 0; index < count; index++)
55+
{
56+
list.Add(items[index]);
2157
}
2258
}
2359

24-
public static void AddRange<T>(this ICollection<T> list, params T[] items)
60+
[OverloadResolutionPriority(3)]
61+
public static void AddRange<T>(this ICollection<T> list, T[] items)
2562
{
2663
for (int index = 0; index < items.Length; index++)
2764
{

0 commit comments

Comments
 (0)