public void TestMergeAdjacentExtensive() { Verbrauch v1 = new Verbrauch() { Obiskennzahl = "123", Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, Einheit = Mengeneinheit.KWH, Wert = 5, Startdatum = new DateTimeOffset(2017, 12, 31, 23, 0, 0, TimeSpan.Zero).UtcDateTime, Enddatum = new DateTimeOffset(2018, 1, 31, 23, 0, 0, TimeSpan.Zero).UtcDateTime }; Verbrauch v2 = new Verbrauch() { Obiskennzahl = "123", Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, Einheit = Mengeneinheit.KWH, Wert = 3, Startdatum = new DateTimeOffset(2018, 1, 31, 23, 0, 0, TimeSpan.Zero).UtcDateTime, Enddatum = new DateTimeOffset(2018, 2, 28, 23, 0, 0, TimeSpan.Zero).UtcDateTime }; HashSet <Verbrauch> result = v1.Merge(v2); Assert.AreEqual(1, result.Count); Assert.AreEqual(v1.Startdatum, result.First().Startdatum); Assert.AreEqual(v2.Enddatum, result.First().Enddatum); Assert.AreEqual(8, result.First().Wert); Assert.IsTrue(result.SetEquals(v2.Merge(v1))); }
public void TestMergeOverlappingIntensive() { Verbrauch v1 = new Verbrauch() { Obiskennzahl = "123", Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, Einheit = Mengeneinheit.KW, Wert = 5, Startdatum = new DateTimeOffset(2017, 12, 31, 23, 0, 0, TimeSpan.Zero).UtcDateTime, Enddatum = new DateTimeOffset(2018, 1, 31, 23, 0, 0, TimeSpan.Zero).UtcDateTime }; Verbrauch v2 = new Verbrauch() { Obiskennzahl = "123", Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, Einheit = Mengeneinheit.KW, Wert = 3, Startdatum = new DateTimeOffset(2018, 1, 15, 23, 0, 0, TimeSpan.Zero).UtcDateTime, Enddatum = new DateTimeOffset(2018, 2, 28, 23, 0, 0, TimeSpan.Zero).UtcDateTime }; var rawResult = v1.Merge(v2); List <Verbrauch> result = new List <Verbrauch>(rawResult); Assert.AreEqual(3, result.Count); result.Sort(new VerbrauchDateTimeComparer()); Assert.AreEqual(v1.Startdatum, result.First().Startdatum); Assert.AreEqual(5, result.First().Wert); Assert.AreEqual(v2.Startdatum, result[1].Startdatum); Assert.AreEqual(v1.Enddatum, result[1].Enddatum); Assert.AreEqual(8, result[1].Wert); Assert.AreEqual(v2.Enddatum, result.Last().Enddatum); Assert.AreEqual(3, result.Last().Wert); Assert.IsTrue(rawResult.SetEquals(v2.Merge(v1))); }
public void TestMergeNoOverlap() { Verbrauch v1 = new Verbrauch() { Obiskennzahl = "123", Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, Einheit = Mengeneinheit.KWH, Wert = 5, Startdatum = new DateTimeOffset(2017, 12, 31, 23, 0, 0, TimeSpan.Zero).UtcDateTime, Enddatum = new DateTimeOffset(2018, 1, 31, 23, 0, 0, TimeSpan.Zero).UtcDateTime }; Verbrauch v2 = new Verbrauch() { Obiskennzahl = "123", Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, Einheit = Mengeneinheit.KWH, Wert = 3, Startdatum = new DateTimeOffset(2018, 2, 28, 23, 0, 0, TimeSpan.Zero).UtcDateTime, Enddatum = new DateTimeOffset(2018, 3, 31, 23, 0, 0, TimeSpan.Zero).UtcDateTime }; HashSet <Verbrauch> result = v1.Merge(v2); Assert.AreEqual(2, result.Count); Assert.IsTrue(result.SetEquals(new HashSet <Verbrauch> { v1, v2 })); }
public void TestMergeAdjacentIntensive() { Verbrauch v1 = new Verbrauch() { Obiskennzahl = "123", Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, Einheit = Mengeneinheit.KW, Wert = 5, Startdatum = new DateTimeOffset(2017, 12, 31, 23, 0, 0, TimeSpan.Zero).UtcDateTime, Enddatum = new DateTimeOffset(2018, 1, 31, 23, 0, 0, TimeSpan.Zero).UtcDateTime }; Verbrauch v2 = new Verbrauch() { Obiskennzahl = "123", Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, Einheit = Mengeneinheit.KW, Wert = 3, Startdatum = new DateTimeOffset(2018, 1, 31, 23, 0, 0, TimeSpan.Zero).UtcDateTime, Enddatum = new DateTimeOffset(2018, 2, 28, 23, 0, 0, TimeSpan.Zero).UtcDateTime }; HashSet <Verbrauch> result12 = v1.Merge(v2); Assert.AreEqual(2, result12.Count); Assert.IsTrue(result12.SetEquals(v2.Merge(v1))); Verbrauch v3 = new Verbrauch() { Obiskennzahl = "123", Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, Einheit = Mengeneinheit.KW, Wert = 5, Startdatum = new DateTimeOffset(2017, 12, 31, 23, 0, 0, TimeSpan.Zero).UtcDateTime, Enddatum = new DateTimeOffset(2018, 1, 31, 23, 0, 0, TimeSpan.Zero).UtcDateTime }; Verbrauch v4 = new Verbrauch() { Obiskennzahl = "123", Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG, Einheit = Mengeneinheit.KW, Wert = 5, Startdatum = new DateTimeOffset(2018, 1, 31, 23, 0, 0, TimeSpan.Zero).UtcDateTime, Enddatum = new DateTimeOffset(2018, 2, 28, 23, 0, 0, TimeSpan.Zero).UtcDateTime }; HashSet <Verbrauch> result34 = v3.Merge(v4); //Assert.AreEqual(1, result34.Count); Assert.IsTrue(result34.SetEquals(v4.Merge(v3))); }
public void ShowCaseTest() { var verbrauchA = new Verbrauch() { Startdatum = new DateTime(2020, 3, 1, 0, 0, 0, DateTimeKind.Utc), Enddatum = new DateTime(2020, 3, 8, 0, 0, 0, DateTimeKind.Utc), Wert = 0.456M, Einheit = Mengeneinheit.MW, Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG }; verbrauchA.ConvertToUnit(Mengeneinheit.KW); Debug.WriteLine($"{nameof(verbrauchA)} contains {verbrauchA.Wert}{verbrauchA.Einheit}"); // v contains 456,000KW try { verbrauchA.ConvertToUnit(Mengeneinheit.TAG); } catch (InvalidOperationException ioe) { Debug.WriteLine(ioe.Message); // KW and TAG are not convertible into each other because they don't share the same dimension. } var verbrauchB = new Verbrauch() { Startdatum = new DateTime(2020, 3, 7, 0, 0, 0, DateTimeKind.Utc), Enddatum = new DateTime(2020, 3, 14, 0, 0, 0, DateTimeKind.Utc), Wert = 0.1M, Einheit = Mengeneinheit.KW, Wertermittlungsverfahren = Wertermittlungsverfahren.MESSUNG }; foreach (Verbrauch v in verbrauchA.Merge(verbrauchB)) { Debug.WriteLine($"{v.Startdatum.ToString("yyyy-MM-dd")} to {v.Enddatum.ToString("yyyy-MM-dd")}: {v.Wert}{v.Einheit}"); } // 2020-03-01 to 2020-03-07: 456,000KW // 2020-03-07 to 2020-03-08: 456,100KW // 2020-03-08 to 2020-03-14: 0,1KW }
public static HashSet <Verbrauch> MergeRedundant(this Verbrauch v1, Verbrauch v2, Boolean biased) { return(v1.Merge(v2, true, biased)); }
/// <summary> /// Merging two Verbrauch instances means adding their values whenever it's possible. /// But generally the result is going to contain multiple Verbrauchs. /// </summary> /// <param name="v1"></param> /// <param name="v2"></param> /// <returns></returns> public static HashSet <Verbrauch> Merge(this Verbrauch v1, Verbrauch v2) { return(v1.Merge(v2, false, false)); }
/// <summary> /// Apply <see cref="Merge(BO4E.COM.Verbrauch,BO4E.COM.Verbrauch)"/> to the provided Verbräuche. /// But remove identical entries that occur in both <paramref name="v1"/> and <paramref name="v2"/> /// </summary> /// <param name="v1"></param> /// <param name="v2"></param> /// <param name="biased"></param> /// <returns></returns> public static HashSet <Verbrauch> MergeRedundant(this Verbrauch v1, Verbrauch v2, bool biased) => v1.Merge(v2, true, biased);
/// <summary> /// Merging two Verbrauch instances means adding their values whenever it's possible. /// But generally the result is going to contain multiple Verbrauchs. /// </summary> /// <param name="v1"></param> /// <param name="v2"></param> /// <returns></returns> public static HashSet <Verbrauch> Merge(this Verbrauch v1, Verbrauch v2) => v1.Merge(v2, false, false);