private void _tildelpoint(Match match, int antal, int[] point)
        {
            _points = point;
            SortedList <string, Loeber> toploebere = new SortedList <string, Loeber>();

            int    n = 0; // tildelte point
            double p = 0.0;

            IList <Loeber> loebereK1       = new List <Loeber>();
            IList <Loeber> loebereK2       = new List <Loeber>();
            IList <Loeber> loebereRestrict = new List <Loeber>();

            List <string> tider = new List <string>();

            // for gennemførte løbere fra de 2 klubber i matchen
            var matchloebere = Loebere.Where(item => ((item.Value.Klub == match.Klub1 && !match.Klub1.Udeblevet) || (item.Value.Klub == match.Klub2 && !match.Klub2.Udeblevet)) && item.Value.IsStatusOK);

            foreach (var kv in matchloebere)
            {
                Loeber l = kv.Value;

                // lav kun beregningen 1 gang for hver tid
                if (!tider.Contains(l.Tid))
                {
                    tider.Add(l.Tid);

                    // noter om vi allerede har restrictioner
                    bool restrict = loebereRestrict.Count > 0;

                    // find alle løbere med denne tid og foretag beregning hvis der er nogle
                    var loebereMedSammeTid = matchloebere.Where(pair => pair.Value.Tid == l.Tid);

                    foreach (var samme in loebereMedSammeTid)
                    {
                        bool   tildel = false;
                        Loeber ll     = samme.Value;

                        // afgør om en løber er kandidat til at få point
                        if (ll.Klub == match.Klub1)
                        {
                            if (loebereK1.Count < antal)
                            {
                                // fra klub1 og under antal har fået tildelt point
                                tildel = true;
                            }
                        }
                        else if (ll.Klub == match.Klub2)
                        {
                            if (loebereK2.Count < antal)
                            {
                                // fra klub2 og under antal har fået tildelt point
                                tildel = true;
                            }
                        }

                        if (tildel)
                        {
                            // hvis der er points at tildele så gør det
                            if (n < point.Length)
                            {
                                p = point[n];
                            }
                            else
                            {
                                p = 0.0;
                            }

                            // giv antal point
                            ll.SetPoint(match, p);

                            // noter hvem der har fået point
                            toploebere.Add(samme.Key, samme.Value);

                            if (ll.Klub == match.Klub1)
                            {
                                loebereK1.Add(ll);
                            }
                            else
                            {
                                loebereK2.Add(ll);
                            }

                            n++;
                        }
                    }
                }
            }

            // fordel point for pointgivende løbere med samme tid
            // løbere med samme tid på tværs af klubber, skal dele de point som
            // en eller flere har fået jvf placering (som vil være tilfældig da de alle har samme tid)
            // loop over løbere som er sorteret på tid
            // for hver ny tid
            // hvis en løber har samme tid som den foregående startes en beregning
            // for alle løbere med denne tid. alle deres point summeres og fordeles på antallet af løbere
            tider.Clear();
            foreach (Loeber l in toploebere.Values)
            {
                // lav kun beregningen 1 gang for hver tid
                if (!tider.Contains(l.Tid))
                {
                    tider.Add(l.Tid);

                    // find alle løbere med denne tid og foretag beregning hvis der er nogle
                    var loebereMedSammeTid = toploebere.Where(kv => kv.Value.Tid == l.Tid);
                    int cntP = loebereMedSammeTid.Count();
                    if (cntP > 1)
                    {
                        // summer point tildelt for dene match
                        double sumP = 0;
                        foreach (KeyValuePair <string, Loeber> kv in loebereMedSammeTid)
                        {
                            sumP += kv.Value.GetPoint(match);
                        }

                        // fordel points på alle med samme match
                        foreach (KeyValuePair <string, Loeber> kv in loebereMedSammeTid)
                        {
                            kv.Value.SetPoint(match, sumP / cntP);
                        }
                    }
                }
            }
        }
        public static IList <Loeber> ReadRunnersFromResultXML2(string filnavn, Config config, List <Klub> klubber)
        {
            string msg = string.Empty;

            IList <Loeber> loebere = new List <Loeber>();

            XmlDocument xmlDoc = new XmlDocument();

            xmlDoc.XmlResolver = null;
            xmlDoc.Load(filnavn);

            XmlNodeList classNodes = xmlDoc.GetElementsByTagName("ClassResult");

            foreach (XmlElement classNode in classNodes)
            {
                // class detail
                string      classtext = string.Empty;
                XmlNodeList classes   = classNode.GetElementsByTagName("ClassShortName");
                if (classes.Count > 0)
                {
                    classtext = classNode.GetElementsByTagName("ClassShortName")[0].InnerText;
                }

                // deltagere
                foreach (XmlElement personResult in classNode.GetElementsByTagName("PersonResult"))
                {
                    // person details
                    XmlElement person     = personResult.GetElementsByTagName("Person")[0] as XmlElement;
                    XmlElement personName = person.GetElementsByTagName("PersonName")[0] as XmlElement;

                    string efternavn = personName.GetElementsByTagName("Family")[0].InnerText;
                    string fornavn   = personName.GetElementsByTagName("Given")[0].InnerText;

                    // club details
                    XmlElement club     = personResult.GetElementsByTagName("Club")[0] as XmlElement;
                    string     klubnavn = (club != null) ? club.GetElementsByTagName("ShortName")[0].InnerText : string.Empty;
                    string     klubId   = (club != null) ? club.GetElementsByTagName("ClubId")[0].InnerText : string.Empty;

                    // time details
                    XmlElement  result      = personResult.GetElementsByTagName("Result")[0] as XmlElement;
                    XmlNodeList resultTimes = result.GetElementsByTagName("Time");
                    string      tid         = string.Empty;
                    if (resultTimes.Count > 0)
                    {
                        tid = resultTimes[0].InnerText;
                    }

                    XmlNodeList ccards = result.GetElementsByTagName("CCardId");
                    string      brik   = string.Empty;
                    if (ccards.Count > 0)
                    {
                        brik = ccards[0].InnerText;
                    }

                    string      placering       = string.Empty;
                    XmlNodeList resultPositions = result.GetElementsByTagName("ResultPosition");
                    if (resultPositions.Count > 0)
                    {
                        placering = resultPositions[0].InnerText;
                    }
                    string status = result.GetElementsByTagName("CompetitorStatus")[0].Attributes["value"].Value;

                    try
                    {
                        // løberen må have en klasse som bruges i matchen
                        var gk = config.gruppeOgKlasse.Find(k => k.LøbsKlasse == classtext);
                        if (gk != null)
                        {
                            Loeber l = new Loeber();
                            l.Stnr      = "0";                                                                                //""];
                            l.Fornavn   = fornavn;                                                                            //"fornavn"];
                            l.Efternavn = efternavn;                                                                          // "efternavn"];
                            l.Klub      = klubber.Find(item => item.Navn.Equals(klubnavn) || item.NavnKort.Equals(klubnavn)); //"klub"
                            if (l.Klub == null)
                            {
                                // add a temporay klub for runners outside the match
                                l.Klub = new Klub(klubId, klubnavn);
                            }
                            l.Løbsklassenavn = classtext;
                            l.Gruppeklasse   = gk.Klasse;
                            l.Placering      = placering;    //"pl"];
                            l.Tid            = _lavtid(tid); //"tid"];
                            l.Status         = status;       //"status"];
                            l.Brik           = brik;

                            loebere.Add(l);
                        }
                    }
                    catch
                    {
                        msg += "løber: " + fornavn + " " + efternavn + " kunne ikke tilføjes\n";
                    }
                }
            }

            if (msg != string.Empty)
            {
                throw new Exception("Problemer med indlæsning af xml-data: \n" + msg);
            }
            return(loebere);
        }
        public static IList <Loeber> ReadRunnersFromStartlistXML3(string filnavn, Config config, List <Klub> klubber)
        {
            string         msg     = string.Empty;
            IList <Loeber> loebere = new List <Loeber>();

            XmlDocument xmlDoc = new XmlDocument();

            xmlDoc.XmlResolver = null;
            xmlDoc.Load(filnavn);

            XmlNodeList classNodes = xmlDoc.GetElementsByTagName("ClassStart");

            if (classNodes.Count == 0)
            {
                throw new Exception("Dette er ikke en fil med startliste data");
            }
            foreach (XmlElement classNode in classNodes)
            {
                // class detail
                string classtext = (classNode.GetElementsByTagName("Class")[0] as XmlElement).GetElementsByTagName("Name")[0].InnerText;

                foreach (XmlElement personStart in classNode.GetElementsByTagName("PersonStart"))
                {
                    // person details
                    XmlElement person     = personStart.GetElementsByTagName("Person")[0] as XmlElement;
                    XmlElement personName = person.GetElementsByTagName("Name")[0] as XmlElement;

                    string efternavn = personName.GetElementsByTagName("Family")[0].InnerText;
                    string fornavn   = personName.GetElementsByTagName("Given")[0].InnerText;

                    // club details
                    XmlElement club       = personStart.GetElementsByTagName("Organisation")[0] as XmlElement;
                    string     klubnavn   = (club != null) ? club.GetElementsByTagName("Name")[0].InnerText : "";
                    string     klubId     = (club != null) ? club.GetElementsByTagName("Id")[0].InnerText : "";
                    string     klubSource = string.Empty;
                    if (klubId != string.Empty)
                    {
                        foreach (XmlAttribute a in club.GetElementsByTagName("Id")[0].Attributes)
                        {
                            if (a.Name == "type")
                            {
                                klubSource = a.Value;
                            }
                        }
                    }

                    // time details
                    string      brik  = string.Empty;
                    string      tid   = string.Empty;
                    XmlNodeList start = personStart.GetElementsByTagName("Start");
                    if (start != null && start.Count == 1)
                    {
                        XmlNodeList startTime = (start[0] as XmlElement).GetElementsByTagName("StartTime");
                        if (startTime != null && startTime.Count == 1)
                        {
                            tid = startTime[0].InnerText;
                        }

                        // brik detlajer
                        XmlNodeList ccard = (start[0] as XmlElement).GetElementsByTagName("ControlCard");
                        if (ccard != null && ccard.Count == 1)
                        {
                            brik = ccard[0].InnerText;
                        }
                    }

                    try
                    {
                        // løberen må have en klasse som bruges i matchen
                        var gk = config.gruppeOgKlasse.Find(k => k.LøbsKlasse == classtext);
                        if (gk != null)
                        {
                            Loeber l = new Loeber();
                            l.Stnr      = "0";                                                                                //""];
                            l.Fornavn   = fornavn;                                                                            //"fornavn"];
                            l.Efternavn = efternavn;                                                                          // "efternavn"];
                            l.Klub      = klubber.Find(item => item.Navn.Equals(klubnavn) || item.NavnKort.Equals(klubnavn)); //"klub"
                            if (l.Klub == null)
                            {
                                // add a temporay klub for runners outside the match
                                l.Klub = new Klub(klubId, klubnavn);
                                if (klubSource != string.Empty)
                                {
                                    l.Klub.Id.Type = klubSource;
                                }
                            }
                            l.Løbsklassenavn = classtext;
                            l.Gruppeklasse   = gk.Klasse;
                            l.StartTid       = _lavtid(tid); //"tid"];
                            l.Brik           = brik;

                            loebere.Add(l);
                        }
                    }
                    catch
                    {
                        msg += "løber: " + fornavn + " " + efternavn + "\n";
                    }
                }
            }

            if (msg != string.Empty)
            {
                throw new Exception("Problemer med indlæsning af xml-data: \n" + msg);
            }

            return(loebere);
        }
        public static IList <Loeber> ReadRunnersFromCsv(string filnavn, Config config, List <Klub> klubber)
        {
            string msg = string.Empty;

            IList <Loeber> loebere = new List <Loeber>();

            // find løbere og tilføj dem til gruppen
            // open the file "data.csv" which is a CSV file with headers
            using (CsvReader csv = new CsvReader(new StreamReader(filnavn, ASCIIEncoding.Default), false, ';'))
            {
                if (csv.FieldCount < 43)
                {
                    msg += "det er vist ikke en csv-fil...\n";
                }
                else
                {
                    // csv.MissingFieldAction = MissingFieldAction.ReplaceByNull;

                    csv.MissingFieldAction      = MissingFieldAction.ReplaceByEmpty;
                    csv.DefaultParseErrorAction = ParseErrorAction.AdvanceToNextLine;

                    // treat header
                    csv.ReadNextRecord();

                    int idxStartnr   = 0;
                    int idxBriknr    = 1;
                    int idxEfternavn = 3;
                    int idxFornavn   = 4;
                    int idxStartTid  = 9;
                    int idxTid       = 11;
                    int idxStatus    = 12;
                    int idxKlubId    = 14;
                    int idxKlub      = 15;
                    int idxKlasse    = 18;
                    int idxPl        = 43;
                    if (csv[0].StartsWith("OE"))
                    {
                        idxStartnr   = 1;
                        idxBriknr    = 3;
                        idxEfternavn = 5;
                        idxFornavn   = 6;
                        idxStartTid  = 11;
                        idxTid       = 13;
                        idxStatus    = 14;
                        idxKlubId    = 19;
                        idxKlub      = 20;
                        idxKlasse    = 25;
                        idxPl        = 57;
                    }

                    while (csv.ReadNextRecord())
                    {
                        try
                        {
                            // løberen må have en klasse som bruges i matchen
                            var gk = config.gruppeOgKlasse.Find(k => k.LøbsKlasse == csv[idxKlasse]);
                            if (gk != null)
                            {
                                Loeber l = new Loeber();
                                l.Stnr      = csv[idxStartnr];                                                             //"startnr"];
                                l.Fornavn   = csv[idxFornavn];                                                             //"fornavn"];
                                l.Efternavn = csv[idxEfternavn];                                                           // "efternavn"];
                                string klub   = string.IsNullOrWhiteSpace(csv[idxKlub]) ? csv[idxKlub - 1] : csv[idxKlub]; // klub city eller navn
                                string klubId = csv[idxKlubId - 1];
                                l.Klub = klubber.Find(item => item.Navn.Equals(klub) || item.NavnKort.Equals(klub));       //"klub"
                                if (l.Klub == null)
                                {
                                    // add a temporay klub for runners outside the match
                                    l.Klub = new Klub(klubId, klub);
                                }
                                l.Løbsklassenavn = csv[idxKlasse];
                                l.Gruppeklasse   = gk.Klasse;
                                l.Placering      = csv[idxPl];           //"pl"];
                                l.Tid            = _lavtid(csv[idxTid]); //"tid"];
                                l.Status         = csv[idxStatus];       //"status"];
                                l.StartTid       = _lavtid(csv[idxStartTid], config.StartTid);
                                l.Brik           = csv[idxBriknr] != "0" ? csv[idxBriknr] : string.Empty;

                                loebere.Add(l);
                            }
                        }
                        catch
                        {
                            msg += "linje: " + csv.CurrentRecordIndex + "\n";
                        }
                    }
                }
            }

            if (msg != string.Empty)
            {
                throw new Exception("Problemer med indlæsning af csv-data: \n" + msg);
            }

            return(loebere);
        }