获取循环以正确构建字符串
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() + " ");
}
我正在尝试从此网页中提取锦标赛年龄:
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() + " ");
}