Как предотвратить создание дублирующегося элемента в цикле Foreach в C # - PullRequest
0 голосов
/ 30 августа 2018

У меня есть цикл 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 голосов
/ 30 августа 2018

Может проверить, содержит ли 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>");
        }
    }
0 голосов
/ 30 августа 2018

Попробуйте использовать GroupBy для свойства, которое вы хотите различить, и выберите только одну запись в группе.

Этот код только для имущества Title

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

или 2 свойства Title и Description

foreach (var result in searchResults.Results.GroupBy(p => new {p.Title, p.Description}).Select(g => g.First())
{
}
0 голосов
/ 30 августа 2018

Сохраните набор результатов, которые вы уже видели, и проверьте, являются ли они новыми, прежде чем «делать что-то»

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

Затем используйте заголовок или что-то еще в качестве «ключа», чтобы сделать их уникальными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...