如何避免从列表中重新添加相同的文本?

时间:2014-06-12 08:32:08

标签: c# .net winforms

我在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的附加程序。

1 个答案:

答案 0 :(得分:2)

问:如果有一些新文本与之前已添加的文本有一些不同的文本,我怎么能说它不会每10秒添加到newText?

A:在添加元素之前,您可以使用List.Contains检查某个元素是否已存在。