【问题标题】:Find a string list whether containing same element more than once查找是否多次包含相同元素的字符串列表
【发布时间】:2012-02-03 00:26:30
【问题描述】:

我正在为产品销售网站编写自己的特定网络爬虫。由于它们非常糟糕的编码性质,我得到了指向同一页面的 url。

示例一

http://www.hizlial.com/bilgisayar/bilgisayar-bilesenleri/bilgisayar/yazicilar/samsung-scx-3200-tarayici-fotokopi-lazer-yazici_30.033.1271.0043.htm

比如上面的页面和下面的一样

http://www.hizlial.com/bilgisayar-bilesenleri/bilgisayar/yazicilar/samsung-scx-3200-tarayici-fotokopi-lazer-yazici_30.033.1271.0043.htm

如您所见,当您通过'/' 字符拆分时,它包含 2 个“bilgisayar”元素

所以我想要的是像这样拆分网址

 string[] lstSPlit = srURL.Split('/');

然后检查该列表是否多次包含相同的元素。任何元素。如果包含任何元素,我将跳过 url,因为我已经从其他页面提取了真实的 url。那么最好的方法是什么?

更长但有效的版本

string[] lstSPlit = srHref.Split('/');
bool blDoNotAdd = false;
HashSet<string> splitHashSet=new HashSet<string>();
foreach (var vrLstValue in lstSPlit)
{
    if (vrLstValue.Length > 1)
    {
        if (splitHashSet.Contains(vrLstValue) == false)
        {
            splitHashSet.Add(vrLstValue);
        }
        else
        {
            blDoNotAdd = true;
            break;
        }
    }
}

【问题讨论】:

  • 所以您想检查lstSPlit 是否多次包含同一个项目?或者您想检查它是否包含您在之前的运行中看到的项目?
  • 同一项目不止一次。它可以是它拥有的任何项目

标签: c# wpf list element contains


【解决方案1】:
if (list.Distinct().Count() < list.Count)

这应该比分组更快。 (我没量过)

您可以通过编写自己的扩展方法来使其更快,该方法将项目添加到 HashSet&lt;T&gt; 并在 Add() 返回 false 时立即返回 false。

你甚至可以使用邪恶的速记来做到这一点:

if (!list.All(new HashSet<string>().Add))

【讨论】:

  • 非常感谢。工作得很好。更正版本“if (lstSPlit.Distinct().Count()
  • 你好。非常重要的另一个问题。我还需要添加长度限制。例如,当它作为 url 给出时:exa.com.tr 它得到 2 个空字符串并导致我跳过它。所以我不得不说元素长度大于2例如
  • @MonsterMMORPG:只要在两边放一个Where。哈希集版本将更加高效。
  • 我添加了更长的工作版本。你能检查并评论它。添加到问题中。谢谢。
  • @MonsterMMORPG:你可以用if(!splitHashSet.Add(vrLstValue)) { ... break; }替换整个内部if/else
【解决方案2】:
if(lstSPlit.GroupBy(i => i).Where(g => g.Count() > 1).Any())
{
    // found more than once
}

【讨论】:

  • 感谢您的回答。我想 SLaks 方法会工作得更快:)
猜你喜欢
  • 2017-11-20
  • 2010-10-04
  • 1970-01-01
  • 2013-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多