public static Pine operator /(double number, Pine pine) { Pine ret = new Pine(); foreach (double num in pine) { ret.Add(number / num); } return(ret); }
public static Pine operator -(Pine pine, double number) { Pine ret = new Pine(); foreach (double num in pine) { ret.Add(num - number); } return(ret); }
public static Pine ToPine(this IEnumerable <double> source) { Pine ret = new Pine(); foreach (double num in source) { ret.Add(num); } return(ret); }
public static Pine BarsSince(PineBool source) { Pine ret = new Pine(); double count = 0; foreach (bool x in source) { if (x) { count++; } else { count = 0; } ret.Add(count); } return(ret); }
//public static Pine BarsSince(PineBool source) //{ // Pine ret = new Pine(); // foreach (bool x in source) // { // if (x) // count++; // else if() // else // count = 0; // ret.Add(count); // } // return ret; //} public static Pine BarsSince(PineBool source) { Pine buf = new Pine(); double count = 0; for (int i = 0; i < source.Count; i++) { if (source[i]) { count = 1; } else if (i > 0 && !source[i] && buf.ElementAt(i - 1) > 0) { count++; } else { count = 0; } buf.Add(count); } buf.Reverse(); return(buf); }
public static Pine ToPine(this IEnumerable <double?> source, Approximation approximation = Approximation.Linear) { switch (approximation) { case Approximation.Linear: return(LinearApproximation()); case Approximation.Step: return(StepApproximation()); default: return(null); } Pine LinearApproximation() { int countNum = source.Count(x => x != null); // количество имеющих значение в последовательности if (countNum == 0) { return(Enumerable.Range(0, source.Count()).Select(x => 0.0).ToPine()); } if (countNum == 1) { double _value = source.First(x => x != null).Value; return(Enumerable.Range(0, source.Count()).Select(x => _value).ToPine()); } Pine ret = new Pine(); // возвращаемый массив double value1 = 0, value2 = 0, delta = 0; // последние значащие и приращение на каждый шаг IEnumerable <double?> sour = source.SkipWhile(x => x == null); // текущее состояние последовательности = source.SkipWhile(x => x == null); // пропуск первых не значащих int numberCurr; // номер обрабатываемого значения int countNull; // количество незначащих значений в следующем промежутке for ( numberCurr = 1; // номер обрабатываемого значения numberCurr < countNum; sour = sour.SkipWhile(x => x == null), numberCurr++ ) { value1 = sour.First().Value; // первое значащае число ret.Add(value1); sour = sour.Skip(1); value2 = sour.First(x => x != null).Value; // второе значащае число countNull = sour.TakeWhile(x => x == null).Count(); // количество не имеющих значения между первым и вторым числом delta = (value2 - value1) / (countNull + 1); // приращение на каждый шаг for (int ind = 0; ind < countNull; ind++) { ret.Add(value1 += delta); // заполнение последовательности } } // обработка конца последовательности ret.Add(value2); sour = sour.Skip(1); countNull = sour.Count(); // количество последних не имеющих значения for (int ind = 0; ind < countNull; ind++) { ret.Add(value2 += delta); // заполнение последовательности } return(ret); } Pine StepApproximation() { int countNum = source.Count(x => x != null); // количество имеющих значение в последовательности if (countNum == 0) { return(Enumerable.Range(0, source.Count()).Select(x => 0.0).ToPine()); } if (countNum == 1) { double _value = source.First(x => x != null).Value; return(Enumerable.Range(0, source.Count()).Select(x => _value).ToPine()); } Pine ret = new Pine(); // возвращаемый массив double value1 = 0, value2 = 0; // последние значащие и приращение на каждый шаг IEnumerable <double?> sour = source.SkipWhile(x => x == null); // текущее состояние последовательности = source.SkipWhile(x => x == null); // пропуск первых не значащих int numberCurr; // номер обрабатываемого значения int countNull; // количество незначащих значений в следующем промежутке for ( numberCurr = 1; // номер обрабатываемого значения numberCurr < countNum; sour = sour.SkipWhile(x => x == null), numberCurr++ ) { value1 = sour.First().Value; // первое значащае число ret.Add(value1); sour = sour.Skip(1); value2 = sour.First(x => x != null).Value; // второе значащае число countNull = sour.TakeWhile(x => x == null).Count(); // количество не имеющих значения между первым и вторым числом for (int ind = 0; ind < countNull; ind++) { ret.Add(value1); // заполнение последовательности } } // обработка конца последовательности ret.Add(value2); sour = sour.Skip(1); countNull = sour.Count(); // количество последних не имеющих значения for (int ind = 0; ind < countNull; ind++) { ret.Add(value2); // заполнение последовательности } return(ret); } }