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

时间:2016-04-25 10:35:27

标签: c# loops flow

我试图从这个网页上拉开比赛时代:

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

我尝试根据每个表的有效年龄创建字符串。

例如,如果" Carling Cup"可以由7岁的孩子输入,然后生成一个字符串,如" U7",或者如果它可以被7,8和9岁的孩子输入,结果字符串将是" U7,U8,U9"。

我已经开始了,但是如果年龄变得像这样,我的逻辑将会破裂"在7岁以下,在这里没有8岁以下的差距,在9s以下#34;

这是我的代码:

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消失时,如何优雅地处理它,忽略它并转到下一个?

1 个答案:

答案 0 :(得分:1)

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

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