Skip to content

Commit e41be22

Browse files
authored
Only allocate lists when we need to (#120)
1 parent 125988c commit e41be22

File tree

3 files changed

+72
-27
lines changed

3 files changed

+72
-27
lines changed

Source/Schema.NET/Values{T1,T2,T3,T4}.cs

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -101,40 +101,60 @@ public Values(IEnumerable<object> items)
101101
throw new ArgumentNullException(nameof(items));
102102
}
103103

104-
var items1 = new List<T1>();
105-
var items2 = new List<T2>();
106-
var items3 = new List<T3>();
107-
var items4 = new List<T4>();
104+
List<T1> items1 = null;
105+
List<T2> items2 = null;
106+
List<T3> items3 = null;
107+
List<T4> items4 = null;
108108

109109
foreach (var item in items)
110110
{
111111
if (item is T4 itemT4)
112112
{
113+
if (items4 == null)
114+
{
115+
items4 = new List<T4>();
116+
}
117+
113118
items4.Add(itemT4);
114119
}
115120
else if (item is T3 itemT3)
116121
{
122+
if (items3 == null)
123+
{
124+
items3 = new List<T3>();
125+
}
126+
117127
items3.Add(itemT3);
118128
}
119129
else if (item is T2 itemT2)
120130
{
131+
if (items2 == null)
132+
{
133+
items2 = new List<T2>();
134+
}
135+
121136
items2.Add(itemT2);
122137
}
123138
else if (item is T1 itemT1)
124139
{
140+
if (items1 == null)
141+
{
142+
items1 = new List<T1>();
143+
}
144+
125145
items1.Add(itemT1);
126146
}
127147
}
128148

129-
this.HasValue1 = items1.Count > 0;
130-
this.HasValue2 = items2.Count > 0;
131-
this.HasValue3 = items3.Count > 0;
132-
this.HasValue4 = items4.Count > 0;
149+
this.HasValue1 = items1?.Count > 0;
150+
this.HasValue2 = items2?.Count > 0;
151+
this.HasValue3 = items3?.Count > 0;
152+
this.HasValue4 = items4?.Count > 0;
133153

134-
this.Value1 = items1;
135-
this.Value2 = items2;
136-
this.Value3 = items3;
137-
this.Value4 = items4;
154+
this.Value1 = items1 == null ? default : (OneOrMany<T1>)items1;
155+
this.Value2 = items2 == null ? default : (OneOrMany<T2>)items2;
156+
this.Value3 = items3 == null ? default : (OneOrMany<T3>)items3;
157+
this.Value4 = items4 == null ? default : (OneOrMany<T4>)items4;
138158
}
139159

140160
/// <summary>

Source/Schema.NET/Values{T1,T2,T3}.cs

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -78,33 +78,48 @@ public Values(IEnumerable<object> items)
7878
throw new ArgumentNullException(nameof(items));
7979
}
8080

81-
var items1 = new List<T1>();
82-
var items2 = new List<T2>();
83-
var items3 = new List<T3>();
81+
List<T1> items1 = null;
82+
List<T2> items2 = null;
83+
List<T3> items3 = null;
8484

8585
foreach (var item in items)
8686
{
8787
if (item is T3 itemT3)
8888
{
89+
if (items3 == null)
90+
{
91+
items3 = new List<T3>();
92+
}
93+
8994
items3.Add(itemT3);
9095
}
9196
else if (item is T2 itemT2)
9297
{
98+
if (items2 == null)
99+
{
100+
items2 = new List<T2>();
101+
}
102+
93103
items2.Add(itemT2);
94104
}
95105
else if (item is T1 itemT1)
96106
{
107+
if (items1 == null)
108+
{
109+
items1 = new List<T1>();
110+
}
111+
97112
items1.Add(itemT1);
98113
}
99114
}
100115

101-
this.HasValue1 = items1.Count > 0;
102-
this.HasValue2 = items2.Count > 0;
103-
this.HasValue3 = items3.Count > 0;
116+
this.HasValue1 = items1?.Count > 0;
117+
this.HasValue2 = items2?.Count > 0;
118+
this.HasValue3 = items3?.Count > 0;
104119

105-
this.Value1 = items1;
106-
this.Value2 = items2;
107-
this.Value3 = items3;
120+
this.Value1 = items1 == null ? default : (OneOrMany<T1>)items1;
121+
this.Value2 = items2 == null ? default : (OneOrMany<T2>)items2;
122+
this.Value3 = items3 == null ? default : (OneOrMany<T3>)items3;
108123
}
109124

110125
/// <summary>

Source/Schema.NET/Values{T1,T2}.cs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,26 +59,36 @@ public Values(IEnumerable<object> items)
5959
throw new ArgumentNullException(nameof(items));
6060
}
6161

62-
var items1 = new List<T1>();
63-
var items2 = new List<T2>();
62+
List<T1> items1 = null;
63+
List<T2> items2 = null;
6464

6565
foreach (var item in items)
6666
{
6767
if (item is T2 itemT2)
6868
{
69+
if (items2 == null)
70+
{
71+
items2 = new List<T2>();
72+
}
73+
6974
items2.Add(itemT2);
7075
}
7176
else if (item is T1 itemT1)
7277
{
78+
if (items1 == null)
79+
{
80+
items1 = new List<T1>();
81+
}
82+
7383
items1.Add(itemT1);
7484
}
7585
}
7686

77-
this.HasValue1 = items1.Count > 0;
78-
this.HasValue2 = items2.Count > 0;
87+
this.HasValue1 = items1?.Count > 0;
88+
this.HasValue2 = items2?.Count > 0;
7989

80-
this.Value1 = items1;
81-
this.Value2 = items2;
90+
this.Value1 = items1 == null ? default : (OneOrMany<T1>)items1;
91+
this.Value2 = items2 == null ? default : (OneOrMany<T2>)items2;
8292
}
8393

8494
/// <summary>

0 commit comments

Comments
 (0)