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

C# 如何防止在C中的Foreach循环中生成重复项,c#,foreach,C#,Foreach,我有一个foreach循环,它构建搜索结果,有时它会返回相同的页面名称和描述,但链接会有所不同,因为它有一个第三方库模块,在URL中有不同的查询 例如: 参考资料/Videos/emodule/936/eitem/75将有一个视频 及 /参考资料/视频/emodule/936/eitem/73将有所不同 标题和描述是相同的 如何更改foreach循环以检查页面标题是否相同,如果相同,则排除sb.AppendLine搜索结果 这是我当前的代码: TotalPageResults = "0"; va

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

例如:

参考资料/Videos/emodule/936/eitem/75将有一个视频

/参考资料/视频/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(); 
}

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

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

然后使用标题或任何东西作为您的“键”,使其唯一。

可以检查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>");
        }
    }
尝试对要区分的属性使用GroupBy,并在组中仅选择一条记录

此代码仅用于属性标题

或2个属性标题和描述


最简单的方法是创建一个字符串集合,在循环时为每个结果对象添加标题,在循环开始时,检查它是否包含当前结果对象的标题。此代码有什么问题?使用标题字段选择不同的结果,或按标题分组,然后首先从结果中选择。我认为他仍然需要具有相同标题但不再次显示标题的单个项目?不确定。@Thierry,这段代码没有问题。我需要一个关于如何创建IF语句的建议,该语句将防止在结果视图中返回相同的项。如果不这样做,则从您正在考虑的结果中提取标题或标题+说明,然后检查该组合是否将其视为密钥在您的alreadySeenList中。如果它不在列表中,请执行您通常的逻辑,然后将其添加到列表中。如果它在列表中,那么您之前已经处理过这个结果,所以什么也不要做。一旦你遍历了所有结果,alreadySeenList现在就没用了,因为“真实数据”在你的stringbuilder中。Daves回答这个问题的效率要低得多,因为每次contains都必须搜索所有html来寻找匹配项,而不是HashSet上的.contains的精确匹配项,但我想它会起作用的:
   foreach (var result in searchResults.Results.GroupBy(p => p.Title).Select(g => g.First())
   {
   }
foreach (var result in searchResults.Results.GroupBy(p => new {p.Title, p.Description}).Select(g => g.First())
{
}