Объединение двух списков объектов на основе атрибута - PullRequest
0 голосов
/ 23 января 2019

У меня определен этот класс:

public class DocumentSearchResult
    {
        public string RowCount { get; set; }
        public string TotalRows { get; set; }
        public Int64 DocumentQueryExecutionTimeMS { get; set; }
        public string DocumentPath { get; set; }
        public string DocumentName { get; set; }
        public string DocumentTitle { get; set; }
        public string DocumentSize { get; set; }
        public string DocumentAuthor { get; set; }
        public string DocumentDescription { get; set; }
        public string DocumentFileExtension { get; set; }
        public double DocumentRank { get; set; }
        public Int64 DocumentDocId { get; set; }
        public Int64 DocumentWorkId { get; set; }
        public string DocumentWrite { get; set; }
        public string DocumentParentLink { get; set; }
        public string DocumentLastModifiedDate { get; set; }
        public string DocumentFileType { get; set; }
        public string DocumentSummary { get; set; }
        public string DocumentLibrary { get; set; }

        //These next set of properties are used for Viewing the results in embedded or preview
        public string DocumentRedirectedEmbededURL { get; set; }
        public string DocumentRedirectPreviewURL { get; set; }
        public string DocumentRedirectURL { get; set; }
        //These two properties are needed to show how the results were gathered MetaData-Content and the folder path location in Ember of the file
        public string SearchSource { get; set; }
        public string FolderPath { get; set; }

Я получаю данные из двух разных источников и заполняю этот класс соответствующей информацией.Теперь клиент хочет, чтобы опция включала оба набора данных и возвращала один ответ, устраняя дубликаты, а другой вариант - находить совпадающие записи из одного списка, которые находятся в другом списке, и возвращать только элементы, которые появляются в обоих списках.Таким образом, первый вариант - это слияние AND, чтобы включить все результаты из обоих списков, но не показывать дубликаты.Другой - объединение ИЛИ, где результаты должны находиться в обоих списках, обрезая все записи, которые не совпадают.

Таким образом, чтобы объединить список или объединить список, я создал эту функцию:

public List<DocumentSearchResult> StitchMetaDataAndContent(List<DocumentSearchResult> metaDataResults, List<DocumentSearchResult> contentResults, bool merge = false)
    {
        if (merge)
        {
            List<DocumentSearchResult> stitchedContent;
            stitchedContent = metaDataResults.Union(contentResults).ToList();
            foreach(DocumentSearchResult docX in stitchedContent)
            {
                docX.RowCount = (metaDataResults.Count + contentResults.Count).ToString();
            }
            return stitchedContent;
        }
        else
        {
           metaDataResults.RemoveAll(x => !contentResults.Any(y => y.DocumentName == x.DocumentName));
            foreach(DocumentSearchResult docX in metaDataResults)
            {
                docX.RowCount = metaDataResults.ToString();
            }
            return metaDataResults;
        }
    }

Для части слияния я использую оператор Union для слияния контента в результаты.Кажется, это работает, но у меня проблемы с удалением дубликатов.Мне нужно удалить дубликаты на основе свойства DocumentName для обоих наборов.Это единственные данные в записи, которые гарантированно идентичны между двумя наборами.

Во втором кажется, что RemoveAll работает, используя DocumentName (я продолжаю проверять это, чтобы убедиться), и удаляя все файлы в списке metaDataResult, которых нет в списке contentResults, но яобеспокоен тем, что это будет замедляться по мере увеличения списков.Вполне возможно, что metaDataResults может быть 10000, и я знаю, что некоторые поиски на contentResults могут быть более 150K результатов.Является ли RemoveAll лучшим подходом к этому?Есть ли более быстрый способ, которым кто-то может указать мне, что это может повысить производительность?

Спасибо.

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