Skip to content

Commit e470ac5

Browse files
committed
Fix commit a6643d1
1 parent a6643d1 commit e470ac5

2 files changed

Lines changed: 301 additions & 71 deletions

File tree

Algo/Strategies/StrategyParam.cs

Lines changed: 51 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -89,91 +89,79 @@ public T Value
8989
if (!this.IsValid(value))
9090
throw new ArgumentOutOfRangeException(nameof(value), value, LocalizedStrings.InvalidValue);
9191

92-
if (_hasStep && !IsStepValid(value))
92+
if (_hasStep && _hasStep && !IsValueMatchesStep(GetValueType(), value, _stepValue, _stepBaseValue))
9393
throw new ArgumentOutOfRangeException(nameof(value), value, LocalizedStrings.InvalidValue);
9494

9595
_value = value;
9696
NotifyChanged();
9797
}
9898
}
9999

100-
private bool IsStepValid(T value)
100+
private static bool IsValueMatchesStep(Type type, T value, T step, T baseValue)
101101
{
102-
if (!_hasStep)
103-
return true;
104-
105-
var type = GetValueType();
106-
107-
try
102+
if (type == typeof(TimeSpan))
108103
{
109-
if (type == typeof(TimeSpan))
110-
{
111-
var v = value.To<TimeSpan>();
112-
var b = _stepBaseValue.To<TimeSpan>();
113-
var s = _stepValue.To<TimeSpan>();
104+
var v = value.To<TimeSpan>();
105+
var b = baseValue.To<TimeSpan>();
106+
var s = step.To<TimeSpan>();
114107

115-
var diff = v - b;
108+
var diff = v - b;
116109

117-
if (diff < TimeSpan.Zero)
118-
return false;
110+
if (diff < TimeSpan.Zero)
111+
return false;
119112

120-
return diff.Ticks % s.Ticks == 0;
121-
}
122-
else if (type.IsNumericInteger())
123-
{
124-
var v = value.To<long>();
125-
var b = _stepBaseValue.To<long>();
126-
var s = _stepValue.To<long>();
113+
return diff.Ticks % s.Ticks == 0;
114+
}
115+
else if (type.IsNumericInteger())
116+
{
117+
var v = value.To<long>();
118+
var b = baseValue.To<long>();
119+
var s = step.To<long>();
127120

128-
var diff = v - b;
121+
var diff = v - b;
129122

130-
if (diff < 0)
131-
return false;
123+
if (diff < 0)
124+
return false;
132125

133-
return diff % s == 0;
134-
}
135-
else if (type.IsNumeric())
136-
{
137-
var v = value.To<decimal>();
138-
var b = _stepBaseValue.To<decimal>();
139-
var s = _stepValue.To<decimal>();
126+
return diff % s == 0;
127+
}
128+
else if (type.IsNumeric())
129+
{
130+
var v = value.To<decimal>();
131+
var b = baseValue.To<decimal>();
132+
var s = step.To<decimal>();
140133

141-
var diff = v - b;
134+
var diff = v - b;
142135

143-
if (diff < 0)
144-
return false;
136+
if (diff < 0)
137+
return false;
145138

146-
var q = diff / s;
147-
var rq = Math.Round(q);
139+
var q = diff / s;
140+
var rq = Math.Round(q);
148141

149-
return (q - rq).Abs() < 1e-10m;
150-
}
151-
else if (type == typeof(Unit))
152-
{
153-
var v = value.To<Unit>();
154-
var b = _stepBaseValue.To<Unit>();
155-
var s = _stepValue.To<Unit>();
142+
return (q - rq).Abs() < 1e-10m;
143+
}
144+
else if (type == typeof(Unit))
145+
{
146+
var v = value.To<Unit>();
147+
var b = baseValue.To<Unit>();
148+
var s = step.To<Unit>();
156149

157-
if (v.Type != b.Type || v.Type != s.Type)
158-
return false;
150+
if (v.Type != b.Type || v.Type != s.Type)
151+
return false;
159152

160-
var diff = v.Value - b.Value;
153+
var diff = v.Value - b.Value;
161154

162-
if (diff < 0)
163-
return false;
155+
if (diff < 0)
156+
return false;
164157

165-
var q = diff / s.Value;
166-
var rq = Math.Round(q);
158+
var q = diff / s.Value;
159+
var rq = Math.Round(q);
167160

168-
return (q - rq).Abs() < 1e-10m;
169-
}
170-
else
171-
throw new NotSupportedException(type.FullName);
172-
}
173-
catch
174-
{
175-
return false;
161+
return (q - rq).Abs() < 1e-10m;
176162
}
163+
else
164+
throw new NotSupportedException(type.FullName);
177165
}
178166

179167
/// <summary>
@@ -202,13 +190,12 @@ public StrategyParam<T> SetStep(T step, T baseValue = default)
202190
if (invalid)
203191
throw new ArgumentOutOfRangeException(nameof(step), step, LocalizedStrings.IntervalMustBePositive);
204192

193+
if (!IsValueMatchesStep(type, _value, step, baseValue))
194+
throw new ArgumentOutOfRangeException(nameof(step), step, LocalizedStrings.InvalidValue);
195+
205196
_stepValue = step;
206197
_stepBaseValue = baseValue;
207198
_hasStep = true;
208-
209-
if (!IsStepValid(_value))
210-
throw new ArgumentOutOfRangeException(nameof(step), step, LocalizedStrings.InvalidValue);
211-
212199
return this;
213200
}
214201

0 commit comments

Comments
 (0)