winforms 为什么当检查字符串是否不存在时,然后才将其添加到列表中,仍然存在重复?

vof42yt1  于 2023-03-24  发布在  其他
关注(0)|答案(1)|浏览(128)

例如,在变量result中,我有:
“2023_03_15_11_50”
它是m中链接的一部分。值:
https://something.com/7c4bbe_c8be14c442b74430b94a983613275e0e~mv2.png/v1/fill/w_512,h_512,al_c,q_85,enc_auto/2023_03_15_11_50.png
但即使我检查添加只有当“2023_03_15_11_50”不存在的最后仍然有两个项目在链接列表中具有相同的“2023_03_15_11_50”
两个不同的链接,但它们都包含在末尾“2023_03_15_11_50”

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.ProgressBar;
using System.Xml;
using HtmlAgilityPack;

namespace Strings
{
    public partial class Form1 : Form
    {
        private List<string> links = new List<string>();
        private string htmlCode = "";

        public Form1()
        {
            InitializeComponent();

            GetLinks();
        }

        private void GetLinks()
        {
            using (WebClient client = new WebClient())
            {
                htmlCode = client.DownloadString("https://somesite.com");
            }

            var linkParser = new Regex(@"\b(?:https?://|www\.)\S+\b", RegexOptions.Compiled | RegexOptions.IgnoreCase);
            var rawString = htmlCode;
            foreach (Match m in linkParser.Matches(rawString))
            {
                if (m.Value.EndsWith("png"))
                {
                    if (!links.Contains(m.Value))
                    {
                        int index = m.Value.LastIndexOf("/");
                        int index1 = m.Value.LastIndexOf(".png");
                        string result = m.Value.Substring(index + 1, index1 - index - 1);
                        if (!links.Contains(result))
                        {
                            links.Add(m.Value);
                        }
                    }
                }
            }
        }

        

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}
pokxtpni

pokxtpni1#

这里links.Contains(result)只检查result是否在列表中,但列表实际上包含URL,因此它仍然返回false。
您需要将result和URL都存储在一个集合中,例如,您可以将列表替换为字典:

private Dictionary<string, string> links = new();

GetLinks方法中的代码需要更改为:

if (!links.ContainsValue(m.Value))
{
    int index = m.Value.LastIndexOf("/");
    int index1 = m.Value.LastIndexOf(".png");
    string result = m.Value.Substring(index + 1, index1 - index - 1);

    /** .net core **/
    links.TryAdd(result, m.Value);

    /** .net framework
    if(!links.ContainsKey(result))
        links.Add(result, m.Value); **/
}

相关问题