2016-04-25 2 views
0

Ich versuche, das Turnier Alter von dieser Webseite zu ziehen:eine Schleife bekommen einen String zu bauen richtig

http://www.reddishvulcans.com/uk_tournament_database.asp

Ich versuche, für die jeweils eine Zeichenfolge auf der Grundlage der gültigen Alter für den Eintritt zu erstellen Tabelle.

Zum Beispiel, wenn der "Carling Cup" von 7-Jährigen eingegeben werden kann, dann würde eine Zeichenfolge wie "U7" generiert, oder wenn es durch 7, 8 und 9 Jahre alt eingebbar ist, wird die resultierende Zeichenfolge "U7, U8, U9".

Ich habe einen Anfang gemacht, aber meine Logik wird brechen, wenn die Zeiten so gehen "Unter 7s, Lücke hier, wo keine unter 8s, unter 9s".

Hier ist mein Code:

public static List<Record> getRecords() 
    { 
     string url = "http://www.reddishvulcans.com/uk_tournament_database.asp"; 
     var Webget = new HtmlWeb(); 
     var doc = Webget.Load(url); 
     var root = doc.DocumentNode; 
     var ages = root.SelectNodes("//div[@class='infobox']/table/tr[5]/td/img"); 

     List<String> tournamentAges = new List<String>(); 
     String ageGroups = ""; 
     List<String> ageString = new List<String>(); 

     for (Int32 i = 0; i < ages.Count(); i++) 
     { 

      if (ages[i].GetAttributeValue("src", "nope") == "images/2016/u6_Yes.gif") 
      { 
       if (!ageString.Contains(" U6 ")) { 
        ageString.Add(" U6 "); 
        continue; 
       } 
      } 
      else if (ages[i].GetAttributeValue("src", "nope") == "images/2016/u6_.gif") 
      { 
       continue; 
      } 

      if (ages[i].GetAttributeValue("src", "nope") == "images/2016/u7_Yes.gif") 
      { 
       if (!ageString.Contains(" U7 ")) 
       { 
        ageString.Add(" U7 "); 
        continue; 
       } 
      } 
      else if (ages[i].GetAttributeValue("src", "nope") == "images/2016/u7_.gif") 
      { 
       continue; 
      } 

      if (ages[i].GetAttributeValue("src", "nope") == "images/2016/u8_Yes.gif") 
      { 
       if (!ageString.Contains(" U8 ")) 
       { 
        ageString.Add(" U8 "); 
        continue; 
       }     
      } 
      else if (ages[i].GetAttributeValue("src", "nope") == "images/2016/u8_.gif") 
      { 
       continue; 
      } 
      // Checks until u16.gif 

      foreach (String a in ageString) 
      { 
       if (a != "") 
       { 
        ageGroups += a; 
       } 

      } 

      ageString.Clear(); 
      if (ageGroups != "") 
        { 
       tournamentAges.Add(ageGroups); 
      } 
      ageGroups = ""; 
      } 
     } 
} 

Um klar zu sein, ich habe Probleme mit der Schleifenlogik.

Der Ablauf geht zur Zeit wie folgt aus:

Loop through current list of images 
    If > u6_Yes.gif 
     Concatenate u6 to ageString 
    else 
     Continue 

aber es an den Anfang zurück weiter wird und in einer Endlosschleife stecken, Wie kann ich es anmutig machen handhaben, wenn u6_.gif ist es weg, ignorieren und zum nächsten gehen?

+1

Da es alle Vergleiche ist, warum Sie keinen 'Schalter' Klausel über' Alter verwenden [i] .GetAttributeValue („src“, „Nö“) '? Das sollte die Lesbarkeit zumindest ein bisschen verbessern. – Adwaenyth

Antwort

2

warum vereinfachst du deine Schleife nicht einfach so?

if (ages[i].GetAttributeValue("src", "nope") == "images/2016/u6_Yes.gif") 
{ 
    if (!ageString.Contains(" U6 ")) 
    { 
     ageString.Add(" U6 "); 
     continue; 
    } 
} 

if (ages[i].GetAttributeValue("src", "nope") == "images/2016/u7_Yes.gif") 
{ 
    if (!ageString.Contains(" U7 ")) 
    { 
     ageString.Add(" U7 "); 
     continue; 
     } 
    } 
} 

(...) 

nur entfernen Sie alle jene else if Blöcke ...

Außerdem sollten Sie Extraktion src Attribut im Alter von Array betrachten. Sie können Linq verwenden und Ihre Schleife viel einfacher machen. Etwas wie folgt aus:

List<String> ageString = new List<String>(); 
List<string> imageSources = ages.Where(x => x.GetAttributeValue("src", "nope").StartsWith("images/2016/u") && x.GetAttributeValue("src", "nope").EndsWith("_Yes.gif")).ToList(); 
foreach (var src in imageSources) 
{ 
    ageString.Add(" " + src.Substring(11, 2).ToUpper() + " "); 
} 
+0

Danke Nino, das ist eine interessante Einstellung. Ich habe Ihre Methode der Verwendung von Linq versucht, aber ageString Liste endet mit 1000 Elementen. Wie würde ich die Zeitalter darin trennen? (Zum Beispiel 7-16) – SCGB

+0

Ich habe eine Antwort bearbeitet. Jetzt werden Quellen mit StartsWith und EndsWith gefiltert. Entschuldigung, ich kann meine Antwort wegen der von Ihnen verwendeten Partyklasse nicht testen (Webget), aber ich hoffe, Sie werden auf die Idee kommen, was ich vorschlage ... – Nino

+0

Danke für Ihre Eingabe, Webget ist ein Teil von HTMLAgilityPack, glaube ich . Ich werde deine Antwort weiter untersuchen, – SCGB