如何比较相同链接的两个列表?

时间:2014-07-03 17:56:55

标签: c# .net

我每隔X秒从计时器刻度事件调用此类:

WebClient contents = new WebClient();
        List<string> links = new List<string>();
        public static List<string> FilteredLinks = new List<string>();
        List<string> Respones = new List<string>();
        public static List<List<string>> Threads = new List<List<string>>();

        public void Links(string FileName)
        {
            HtmlDocument doc = new HtmlDocument();
            doc.Load(FileName);
            foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]"))
            {
                HtmlAttribute att = link.Attributes["href"];
                if (att.Value.StartsWith("http://rotter.net/forum/scoops1"))
                {
                    links.Add(att.Value);
                }
            }

            for (int i = 0; i < links.Count; i++)
            {
                int f = links[i].IndexOf("#");
                string test = links[i].Substring(0, f);
                FilteredLinks.Add(test);
            }

链接和FilteredLinks都是类型列表 我需要它将检查列表中是否已存在项目不再添加它们。 由于它从一个计时器嘀嗒事件中调用,因此每隔X秒,列表就会一遍又一遍地使用相同的项目成长。

3 个答案:

答案 0 :(得分:6)

使用HashSet代替List。这样,您就不必检查重复的字符串。

HashSet<string> links = new HashSet<string>();
  

集合是一个不包含重复元素的集合,

http://msdn.microsoft.com/en-us/library/bb359438(v=vs.110).aspx

答案 1 :(得分:3)

有三种方法可以解决您的问题

  1. 使用正确的数据结构。 HashSet为L.B pointed out

  2. 在完成添加后,使用Distinct生成一个只有不同的列表

    links = link.Distinct();

  3. 在致电添加

  4. 之前使用Contains


    if (!links.Contains(att.Value))  
       links.Add(att.Value);
    

    如果案件存在问题,您需要传递一个StringComparer例如

    if (!links.Contains(att.Value, StringComparer.InvariantCultureIgnoreCase ))
    

答案 2 :(得分:0)

您可以为此

制作自己的方法
             public boolean isPresent(List mylist,String search)
             {
             for(String str: myList) {
             if(str.trim().contains(search))
             return true;
             }
             return false;
              }