代码之家  ›  专栏  ›  技术社区  ›  Tig7r

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

  •  -1
  • Tig7r  · 技术社区  · 6 年前

    我有一个foreach循环建立搜索结果,有时它会返回相同的网页名称和描述,但链接将是不同的,因为它有一个第三方画廊模块,其中有不同的查询网址。

    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 回复  |  直到 6 年前
        1
  •  1
  •   rBalzer    6 年前

    可以检查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
  •  2
  •   Davesoft    6 年前

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

            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
                }
            }
    

        3
  •  0
  •   Antoine V    6 年前

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

    此代码仅用于属性 Title

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

    或2个属性 Description

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