为何检查字符串不存在再添加到列表仍出现重复项?
问题分析与修复方案
问题根源
你的代码逻辑存在判断对象错误: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); } } } }
关键调整说明
- 新增
processedFilenames集合:专门存储已经添加过的文件名(即你之前的result),确保相同文件名的链接只被添加一次。 - 调整判断逻辑:先提取文件名,再检查集合中是否存在该文件名,不存在才添加链接并将文件名存入集合。
- 变量名优化:将
index、index1改为更具语义的名称,提升代码可读性。
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

