我在Form1中有一个计时器,用于测试im使用10秒。 在计时器i从网站下载一些HTML代码并从中提取特定的文本和时间和日期。 然后我将它添加到List 我正在使用计时器,因为我想获得更新,如果有任何像新文本。 问题是每次更新它都会一次又一次地添加相同的文本,即使它不是列表的新内容。
所以在定时器中的3-4个循环后,我在List./中看到相同的文本,如3-4次 我有一个ScrollLabel,它是一个Label控件,我将文本添加到。
这是进行更新的方法:
private void NewsUpdate()
{
counter += 1;
progressBar1.Value = counter;
label9.Text = counter.ToString();
label9.Visible = true;
if (counter == 10)
{
scrollLabel1.Reset();
scrollLabel1.Text = " ";
scrollLabel1.Invalidate();
client.Encoding = System.Text.Encoding.GetEncoding(1255);
page = client.DownloadString("http://rotter.net/scoopscache.html");
TextExtractor.ExtractDateTime(page, newText, dateTime);
StreamWriter w = new StreamWriter(@"d:\rotterhtml\rotterscoops.html");
w.Write(page);
w.Close();
TextExtractor.ExtractText(@"d:\rotterhtml\rotterscoops.html", newText, dateTime);
FilterNews();
combindedString = string.Join(Environment.NewLine, newText);
this.scrollLabel1.Text = combindedString;
counter = 0;
}
}
在计时器刻度事件中,我每隔10秒调用一次这个方法。
这是TextExtractor类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;
namespace ScrollLabelTest
{
class TextExtractor
{
public static void ExtractText(string filePath, List<string> newText, List<string> dateTime)
{
List<string> text = new List<string>();
var htmlDoc = new HtmlAgilityPack.HtmlDocument();
htmlDoc.OptionFixNestedTags = true;
htmlDoc.Load(filePath, System.Text.Encoding.GetEncoding(65001));
if (htmlDoc.DocumentNode != null)
{
var nodes = htmlDoc.DocumentNode.SelectNodes("//a/b");
foreach (var node in nodes)
{
text.Add(node.InnerText);
}
}
List<string> t = filterNumbers(text);
for (int i = 0; i < t.Count; i++)
{
newText.Add(t[i]);
newText.Add(dateTime[i]);
newText.Add("");
}
}
public static void ExtractDateTime(string text, List<string> newText, List<string> dateTime)
{
string pattern1 = "<span style=color:#000099;>(?'hebrew'[^<]*)</span>";
Regex expr1 = new Regex(pattern1, RegexOptions.Singleline);
MatchCollection matches = expr1.Matches(text);
foreach (Match match in matches)
{
string hebrew = match.Groups["hebrew"].Value;
string pattern2 = @"[^\s$]*:[^:]*:\s+\d\d:\d\d";
Regex expr2 = new Regex(pattern2);
Match match2 = expr2.Match(hebrew);
string results = match2.Value;
int i = results.IndexOf("שעה");
results = results.Insert(i + "שעה".Length, " ");
dateTime.Add("דווח במקור " + results);
}
}
private static List<string> filterNumbers(List<string> mix)
{
List<string> onlyStrings = new List<string>();
foreach (var itemToCheck in mix)
{
int number = 0;
if (!int.TryParse(itemToCheck, out number))
{
onlyStrings.Add(itemToCheck);
}
}
return onlyStrings;
}
}
}
在ExtractText方法中,我有以下几行:
newText.Add(t[i]);
newText.Add(dateTime[i]);
newText.Add("");
在计时器滴答事件中的Form1中,我将下载X秒的html文件并提取文本,时间和日期。
如果有一些新文本与之前已经添加的文本有一些不同的文本,我怎么能说它不会每10秒添加到newText?
我想要创建一个更新程序,所以我使用了一个计时器,但我所做的却是将相同的文本重新添加到List和ScrollLabel的附加程序。
答案 0 :(得分:2)
问:如果有一些新文本与之前已添加的文本有一些不同的文本,我怎么能说它不会每10秒添加到newText?
A:在添加元素之前,您可以使用List.Contains检查某个元素是否已存在。