У меня есть следующий класс:Как можно обобщить функцию расширения диапазона?
public class State {
public DateTime Created { get; set; }
public Double A { get; set; }
public Double B { get; set; }
}
Тогда у меня есть два состояния:
State start = new State { Created = DateTime.UtcNow, A = 10.2, B = 20.5 }
State end = new State { Created = DateTime.UtcNow.AddDays(40), A = 1, B = 80 }
Я хотел бы создать список между началом и концом, где значения A и B эволюционировать в линейном между начальным и конечным значениями.
Я был в состоянии создать список выглядит следующим образом:
IList<DateTime> dates = new Range<DateTime>(start.Created, end.Created,).Expand(DateInterval.Day, 1)
Range и расширить несколько помощников я создал ...
Что является лучшим способом для создания эволюции ценностей?
Моя идея будет делать что-то вроде:
IList<State> states = new Range<State>(// here "tell" how each property would evolve ...)
UPDATE
Range Class
public class Range<T> where T : IComparable<T> {
private T _minimum;
private T _maximum;
public T Minimum { get { return _minimum; } set { value = _minimum; } }
public T Maximum { get { return _maximum; } set { value = _maximum; } }
public Range(T minimum, T maximum) {
_minimum = minimum;
_maximum = maximum;
} // Range
public Boolean Contains(T value) {
return (Minimum.CompareTo(value) <= 0) && (value.CompareTo(Maximum) <= 0);
} // Contains
public Boolean ContainsRange(Range<T> Range) {
return this.IsValid() && Range.IsValid() && this.Contains(Range.Minimum) && this.Contains(Range.Maximum);
} // ContainsRange
public Boolean IsInsideRange(Range<T> Range) {
return this.IsValid() && Range.IsValid() && Range.Contains(this.Minimum) && Range.Contains(this.Maximum);
} // IsInsideRange
public Boolean IsValid() {
return Minimum.CompareTo(Maximum) <= 0;
} // IsValid
public override String ToString() {
return String.Format("[{0} - {1}]", Minimum, Maximum);
} // ToString
} // Range
Несколько Диапазон расширения:
public static IEnumerable<Int32> Expand(this Range<Int32> range, Int32 step = 1) {
Int32 current = range.Minimum;
while (current <= range.Maximum) {
yield return current;
current += step;
}
} // Expand
public static IEnumerable<DateTime> Expand(this Range<DateTime> range, TimeSpan span) {
DateTime current = range.Minimum;
while (current <= range.Maximum) {
yield return current;
current = current.Add(span);
}
} // Expand
Я правильно понял: вы хотите заполнить список 'start',' end' и 'n' количеством интерполированных состояний? – cubrr
Что вы пробовали? Похоже, что вычисление дельта на основе разницы, деленной на количество точек данных минус 1, сделало бы трюк. – juharr
То, что я пытаюсь сделать, это создать вспомогательные классы, которые выполняются так же, как и для DateTime ... Поэтому вместо того, чтобы применять его к DateTime или Int32, я применил бы его к свойствам класса. –