如何循环每个Map以从中提取图像链接?

时间:2013-10-27 19:35:00

标签: c# winforms

在form1中我有这段代码:

using (WebClient client = new WebClient())
            {
                client.DownloadFile("http://www.sat24.com/foreloop.aspx?type=0&continent=europa#", localFilename + "Sat24_Temperature_Europe.html");
                client.DownloadFile("http://www.sat24.com/foreloop.aspx?type=1&continent=europa#", localFilename + "Sat24_Rain_Europe.html");
                client.DownloadFile("http://www.sat24.com/foreloop.aspx?type=2&continent=europa#", localFilename + "Sat24_Wind_europe.html");
                client.DownloadFile("http://www.sat24.com/foreloop.aspx?type=3&continent=europa#", localFilename + "Sat24_Lightnings_Europe.html");
                client.DownloadFile("http://www.sat24.com/foreloop.aspx?type=4&continent=europa#", localFilename + "Sat24_Cloudtypes_Europe.html");
                client.DownloadFile("http://www.sat24.com/?ir=true&ra=true&li=false", localFilename + "Sat24_Cloudsheight_Europe.html");
                client.DownloadFile("http://www.sat24.com/en/eu?ir=true", localFilename + "Sat24_Satellite_Europe.html");
            }
            MapsToRead = Directory.GetFiles(localFilename, "*.*");
            for (int i = 0; i < MapsToRead.Length; i++)
            {
                string s = File.ReadAllText(MapsToRead[i]);
                Maps.Add(s);
            }
            StartTags = new List<string>();
            StartTags.Add("image2.ashx"); 
            StartTags.Add("http://www.niederschlagsradar.de/images.aspx"); 
            LastTags = new List<string>();
            LastTags.Add("ra=true");
            LastTags.Add("cultuur=en-GB&continent=europa");
            LastTags.Add("ir=true");

由于大多数情况下html文件中的标签都是相同的,我只在需要的标签中添加了StartTags和LastTags。

现在在新课程中,我有一个方法即可:

public ExtractImages(List<string> FirstTags, List<string> LastTags, List<string> Maps, string LocalFileDir, string UrlsDir)
        {
            localdir = LocalFileDir;
            counter = 0;
            imagesSatelliteUrls = new List<string>();
            imagesRainUrls = new List<string>();
            int startIndex = 0;
            int endIndex = 0;
            int position = 0;
            for (int i = 0; i < FirstTags.Count; i++)
            {
                string startTag = FirstTags[i];
                string endTag = LastTags[i];
                startIndex = Maps[i].IndexOf(startTag);
                while (startIndex > 0)
                {

                    endIndex = Maps[i].IndexOf(endTag, startIndex);
                    if (endIndex == -1)
                    {
                        break;
                    }
                    string t = Maps[i].Substring(startIndex, endIndex - startIndex + endTag.Length);
                    imagesSatelliteUrls.Add(t);

在我使用Form1中的标签进行更改之前,我刚刚添加到每个标签列表相同的标签7次,因为列表映射包含7个索引。 然后在我做的新电话中:

for (int i = 0; i < FirstTags.Count; i++)

因此,FirstTags包含7个索引,LastTags包含7个索引,而Maps包含7个索引。 但是现在改变后,FirstTags包含2个索引,而LastTags包含3个索引。 地图包含7个索引。

如何立即执行FOR循环,以便它将遍历所有7个地图,并为每个地图使用标记。

例如对于Maps [0],StartTag是“image2.ashx” 但对于地图[1]和[2]以及[4] [5]和[6],它的标记相同:“http://www.niederschlagsradar.de/images.aspx

LastTags也是如此。

这就是Form1中的标签现在:

StartTags = new List<string>();
StartTags.Add("image2.ashx"); 
StartTags.Add("http://www.niederschlagsradar.de/images.aspx"); 
LastTags = new List<string>();
LastTags.Add("ra=true");
LastTags.Add("cultuur=en-GB&continent=europa");
LastTags.Add("ir=true");

这就是我在改变它之前的旧版本:

StartTags = new List<string>();
            StartTags.Add("image2.ashx"); 
            StartTags.Add("http://www.niederschlagsradar.de/images.aspx"); // Cloudstypes forecast map of europe
            StartTags.Add("http://www.niederschlagsradar.de/images.aspx"); // Lightnings forecast map of europe
            StartTags.Add("image2.ashx"); // Satellite map of europe
            StartTags.Add("http://www.niederschlagsradar.de/images.aspx"); // Rain forecast map of europe
            StartTags.Add("http://www.niederschlagsradar.de/images.aspx"); // Temperature forecast map of europe
            StartTags.Add("http://www.niederschlagsradar.de/images.aspx"); // Wind forecast map of europe
            LastTags = new List<string>();
            LastTags.Add("ra=true"); // Cloudsheight forecast map of europe
            LastTags.Add("cultuur=en-GB&continent=europa"); // Cloudstypes forecast map of europe
            LastTags.Add("cultuur=en-GB&continent=europa"); // Lightnings forecast map of europe
            LastTags.Add("ir=true"); // Satellite map of europe
            LastTags.Add("cultuur=en-GB&continent=europa"); // Rain forecast map of europe
            LastTags.Add("cultuur=en-GB&continent=europa"); // Temperature forecast map of europe
            LastTags.Add("cultuur=en-GB&continent=europa"); // Wind forecast map of europe

由于其中大多数标签都是相同的我改变了它,但现在如何在新类中创建FOR循环,因为每个List都有另外数量的索引?

1 个答案:

答案 0 :(得分:1)

您不需要压缩您的列表。因为.NET中的字符串是不可变的,并且它们由编译器优化。所有相同的字符串对象都将指向存储字符串值的相同内存。您的旧List当然会有更多的引用指向存储字符串值的内存而不是新的压缩的。但那非常小。如果您想避免用于向Lists添加项目的重复代码,可以尝试使用以下某种Enumerable.Repeat方法:

StartTags = new List<string>();
StartTags.AddRange(Enumerable.Repeat("http://www.niederschlagsradar.de/images.aspx",7));
StartTags[0] = StartTags[3] = "image2.ashx";

LastTags = new List<string>();
LastTags.AddRange(Enumerable.Repeat("cultuur=en-GB&continent=europa",7));
LastTags[0] = "ra=true";
LastTags[3] = "ir=true";