0

我有这个代码:

private void button6_Click(object sender, EventArgs e)
{
    crawlLocaly1 = new CrawlLocaly();
    crawlLocaly1.StartPosition = FormStartPosition.CenterParent;
    DialogResult dr = crawlLocaly1.ShowDialog(this);
    if (dr == DialogResult.Cancel)
    {
        crawlLocaly1.Close();
    }
    else if (dr == DialogResult.OK)
    {
        LocalyKeyWords.Add(crawlLocaly1.getText() + "," + mainUrl);
        crawlLocaly1.Close();
    }
}

当用户单击按钮 6 时,它会打开一个带有文本框的新表单,用户输入一个关键字,该关键字可以是 url,也可以只是一个单词。当用户单击“确定”时,它正在执行以下操作:

LocalyKeyWords.Add(crawlLocaly1.getText() + "," + mainUrl);

LocalyKeyword 是一个列表, crawlLocaly1 是一个新表单,我在其中获取用户在文本框中键入的文本。

mainUrl 是当前网址。

因此,如果 mainUrl 是例如http://www.google.com

用户输入:丹尼尔

所以在索引 0 的 LocalyKeyWords 列表中我会看到:Daniel,http://www.google.com 所以我知道关键字 Daniel 属于http://www.google.com

现在我有这个代码:

private void removeExternals(List<string> externals)
{

}

现在用户可以随时更改和设置 mainUrl。我需要在函数 removeExternals 中检查 mainUrl 现在是什么,然后在 List LocalyKeyWords 中找到 url,然后从 List externals 中删除属于 LocalyKeyWords 中 url 的关键字的所有位置。

例如 mainUrl 现在是http://www.google.com 所以我需要找到属于http://www.google.com 的关键字 例如关键字是 Daniel: Daniel,http://www.google。 com

所以现在删除 List externals 中包含关键字 Daniel 的所有位置

4

1 回答 1

1

正如其他人所说,查找或字典在这里可能是最好的。如果您使用字典滚动:

//Declaration. This will map a Url to one or more keywords.
Dictionary<string, List<string>> LocalyKeyWords = new Dictionary<string, List<string>>();

...

//Adding an item.
if(LocalyKeyWords.ContainsKey(mainUrl)
{
    LocalyKeyWords[mainUrl].Add(crawlLocaly1.getText());
}
else
{
    LocalyKeyWords.Add(mainUrl, new List<string>(new string[] { crawlLocaly1.getText() } ));
}

...

private void removeExternals(List<string> externals)    
{    
     if(!LocalyKeyWords.ContainsKey(mainUrl))
     {
         return;
     }

     List<string> keywords = LocalyKeyWords[mainUrl];
     List<int> indices = new List<int>();

     foreach(string keyword in keywords)
     {
         //Accumulate a list of the indices of the items that match.
         indices = indices.Concat(externals.Select((v, i)
             => v.Contains(keyword) ? i : -1 )).ToList();         
     }

     //Filter out the -1s, grab only the unique indices.
     indices = indices.Where(i => i >= 0).Distinct().ToList();
     //Filter out those items that match the keyword(s) related to mainUrl.
     externals = externals.Where((v, i) => !indices.Contains(i)).ToList();    
} 

这应该可以解决问题,但我不是 100% 确定你的目标是什么。

于 2012-10-09T00:10:43.773 回答