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