如何防止在C#的Foreach循环中生成重复项

时间:2018-08-30 13:01:27

标签: c# foreach

我有一个foreach循环来构建搜索结果,有时它会返回相同的页面名称和描述,但是该链接会有所不同,因为它具有一个第三方画廊模块,该模块在URL中具有不同的查询。

例如:

Resources/Videos/emodule/936/eitem/75会有一个视频

/Resources/Videos/emodule/936/eitem/73会有所不同。

标题和描述相同。

如何更改foreach循环以检查页面标题是否相同,如果相同,则排除sb.AppendLine搜索结果?

这是我当前的代码:

TotalPageResults = "0";
var searchResults = SearchController.Instance.ModuleSearch(query);

if(searchResults != null)
{
    TotalPageResults = searchResults.TotalHits.ToString();
    var sb = new StringBuilder();
    sb.AppendLine("<div class='page_results'><span class='page_results_text'>Page Results:</span></br>");
    foreach(var result in searchResults.Results)
    {
        sb.AppendLine($"</br><span><a href='{result.Url}' class='page_results_link'>{result.Title}</a></span></br><span class='page_result_description'>{result.Description}</span></br><span class='page_results_date_modified'>Updated: {result.DisplayModifiedTime}</span></br>");
    }
    sb.AppendLine("</div>");
    DNNSearchResuls = sb.ToString(); 
}

3 个答案:

答案 0 :(得分:2)

保留一组您已经看到的结果,并在“做某事”之前检查它是否是新的

        var stuffImThinkinAbout = new List<string>();
        var stuffIAlreadyHave = new HashSet<string>();

        foreach (var i in stuffImThinkinAbout)
        {
            if (!stuffIAlreadyHave.Contains(i))
            {
                //do the thing
                stuffIAlreadyHave.Add(i);
            }
            else
            { 
                //skip dupe
            }
        }

然后使用标题或其他任何东西作为您的“键”以使其具有唯一性。

答案 1 :(得分:1)

可以检查Stringbuilder是否已经包含标题和描述。沿线的东西:

foreach(var result in searchResults.Results)
    {
        if(!sb.ToString().Contains(result.Title) && !sb.ToString().Contains(result.Description)
            sb.AppendLine($"</br><span><a href='{result.Url}' class='page_results_link'>{result.Title}</a></span></br><span class='page_result_description'>{result.Description}</span></br><span class='page_results_date_modified'>Updated: {result.DisplayModifiedTime}</span></br>");
        }
    }

答案 2 :(得分:0)

尝试在要区分的属性上使用GroupBy,并在组中仅选择一条记录。

此代码仅适用于属性Title

   foreach (var result in searchResults.Results.GroupBy(p => p.Title).Select(g => g.First())
   {
   }

或2个属性TitleDescription

foreach (var result in searchResults.Results.GroupBy(p => new {p.Title, p.Description}).Select(g => g.First())
{
}