获取循环以正确构建字符串

Getting a loop to build a string correctly

我正在尝试从此网页中提取锦标赛年龄:

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

我正在尝试根据每个条目的有效年龄创建一个字符串 table。

例如,如果 "Carling Cup" 可由 7 岁儿童输入,则将生成类似 "U7" 的字符串,或者如果它可由 7、8 和 9 岁儿童输入,则结果字符串将是 "U7, U8, U9".

我已经开始了,但是如果年龄如此发展,我的逻辑就会崩溃"Under 7s, Gap here where no under 8s, Under 9s"。

这是我的代码:

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 = "";
            }
        }
}

明确地说,我在循环逻辑方面遇到了问题。

目前的流程是这样的:

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

但是会一直回到开头,陷入死循环,如何让它优雅地处理u6_.gif消失的时候,忽略它并转到下一个?

你为什么不像这样简化你的循环?

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;
        }
    }
}

(...)

只需删除所有 else if 块...

此外,您应该考虑从 ages 数组中提取 src 属性。您可以使用 Linq 并使您的循环更简单。像这样:

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() + " ");
}