У меня определен этот класс:
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 лучшим подходом к этому?Есть ли более быстрый способ, которым кто-то может указать мне, что это может повысить производительность?
Спасибо.