void Verbindung_registrieren(Verbindung verbindung, Action<Verbindung[]> onEndOfStream)
 {
     if (verbindung != null)
         _verbindungen.Add(verbindung);
     else
     {
         var tmp = _verbindungen;
         _verbindungen = null;
         onEndOfStream(tmp.ToArray());
     }
 }
 public void Verbindungen_bewerten(Verbindung verbindung)
 {
     Verbindung_registrieren(verbindung,
         Auswerten);
 }
        /// <summary>
        /// Erzeugt die Verbindungen aus den gegebenen Pfaden.
        /// </summary>
        /// <param name="pfad">
        /// The pfad.
        /// </param>
        /// <returns>
        /// The <see cref="Verbindung"/>.
        /// </returns>
        internal IEnumerable<Verbindung> Verbindungenerzeugen(Pfad pfad)
        {
            var linienName = pfad.Strecken.First().Linienname;
            var startHalteStelle = pfad.Starthaltestellenname;

            var abfahrtszeiten = this.fahrplanProvider.Abfahrtszeiten_bei_Haltestelle(linienName, startHalteStelle);

            foreach (var zeit in abfahrtszeiten)
            {
                var verbindung = new Verbindung { Pfad = pfad, Fahrtzeiten = new Fahrtzeit[pfad.Strecken.Length] };

                for (int i = 0; i < pfad.Strecken.Length; i++)
                {
                    verbindung.Fahrtzeiten[i] = new Fahrtzeit();
                }

                // Startzeit der Verbindung ist nur hier bekannt
                verbindung.Fahrtzeiten[0].Abfahrtszeit = zeit;
                yield return verbindung;
            }
        }
        /// <summary>
        /// Ordnet den Verbindungen die Fahrzeiten zu.
        /// </summary>
        /// <param name="verbindung">
        /// The verbindungen.
        /// </param>
        /// <returns>
        /// The <see cref="Verbindung"/>.
        /// </returns>
        internal Verbindung FahrzeitenZuordnen(Verbindung verbindung)
        {
            // Init
            var startHalteStelle = verbindung.Pfad.Starthaltestellenname;
            var ankunftzeitLetzteStrecke = verbindung.Fahrtzeiten[0].Abfahrtszeit;
            var gueltigeVerbindung = false;

            for (var i = 0; i < verbindung.Pfad.Strecken.Length; i++)
            {
                var linienName = verbindung.Pfad.Strecken[i].Linienname;

                // Alle Zeiten an dieser Haltestelle
                var startZeitenHalteStelle = this.fahrplanProvider.Abfahrtszeiten_bei_Haltestelle(
                    linienName, startHalteStelle);

                // Nehme die nächste verfügbare Abfahrtszeit
                // Rollator use case wird nicht berücksichtigt
                foreach (var dateTime in startZeitenHalteStelle)
                {
                    if (dateTime < ankunftzeitLetzteStrecke)
                    {
                        continue;
                    }

                    verbindung.Fahrtzeiten[i].Abfahrtszeit = dateTime;
                    gueltigeVerbindung = true;
                    break;
                }

                if (!gueltigeVerbindung)
                {
                    return null;
                }

                // Frage den Fahrplan über die Dauer der Strecke
                var dauer = this.fahrplanProvider.Fahrtdauer_für_Strecke(linienName, startHalteStelle);

                // Ankunftszeit
                verbindung.Fahrtzeiten[i].Ankunftszeit = verbindung.Fahrtzeiten[i].Abfahrtszeit + dauer;

                // Merke für nächste Runde
                startHalteStelle = verbindung.Pfad.Strecken[i].Zielhaltestellenname;
                ankunftzeitLetzteStrecke = verbindung.Fahrtzeiten[i].Ankunftszeit;
            }

            return verbindung;
        }
 /// <summary>
 /// Schraenkt die gegebenen Verbindungen nach fahrzeit ein.
 /// </summary>
 /// <param name="verbindung">
 /// Die verbindungen.
 /// </param>
 /// <param name="startZeit">
 /// Die start zeit.
 /// </param>
 /// <returns>
 /// The <see cref="Verbindung"/>.
 /// </returns>
 internal Verbindung EinschraenkenNachFahrzeit(Verbindung verbindung, DateTime startZeit)
 {
     return verbindung.Fahrtzeiten[0].Abfahrtszeit >= startZeit ? verbindung : null;
 }
 /// <summary>
 /// Action für die Resultate. Die Verbindung wird in die Resultatliste eingetragen
 /// </summary>
 /// <param name="v">Die Verbindung</param>
 private void MerkeVerbindungInListe(Verbindung v)
 {
     this.results.Add(v);
 }