You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何检查字符串不存在再添加到列表仍出现重复项?

问题分析与修复方案

问题根源

你的代码逻辑存在判断对象错误:links列表存储的是完整的PNG链接,但你用它来检查短字符串result(链接末尾的文件名部分)是否存在。由于result永远不会出现在存储完整链接的links中,!links.Contains(result)的判断永远为真,导致只要链接本身不在列表里就会被添加,最终出现相同文件名、不同链接的重复项。

修复方案

新增一个专门存储已处理过的result的集合(推荐用HashSet<string>,查询效率远高于List<string>),用它来判断是否已经添加过对应文件名的链接。

修改后的代码

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;
    // 用HashSet存储已处理的文件名,避免重复
    HashSet<string> processedFilenames = new HashSet<string>();

    foreach (Match m in linkParser.Matches(rawString))
    {
        if (m.Value.EndsWith("png"))
        {
            int lastSlashIndex = m.Value.LastIndexOf("/");
            int pngExtensionIndex = m.Value.LastIndexOf(".png");
            string filename = m.Value.Substring(lastSlashIndex + 1, pngExtensionIndex - lastSlashIndex - 1);

            // 仅当该文件名未被处理过时,添加链接并记录文件名
            if (!processedFilenames.Contains(filename))
            {
                links.Add(m.Value);
                processedFilenames.Add(filename);
            }
        }
    }
}

关键调整说明

  1. 新增processedFilenames集合:专门存储已经添加过的文件名(即你之前的result),确保相同文件名的链接只被添加一次。
  2. 调整判断逻辑:先提取文件名,再检查集合中是否存在该文件名,不存在才添加链接并将文件名存入集合。
  3. 变量名优化:将index、index1改为更具语义的名称,提升代码可读性。

内容的提问来源于stack exchange,提问作者Daniel Lip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 05:55:35