У меня есть 4 класса, каждый из которых наследуется от одного и того же базового класса. Все они имеют свойство Id & Path. Когда мои данные загружаются из xml, я строю 4 списка на основе этих классов.Найти дубликаты в нескольких списках с помощью linq
У меня есть следующий код, который позволяет мне сравнить 2 списка:
var list1 = settings.EmailFolders.Select(m => m.Path).ToList().
Intersect(settings.LogPaths.Select(m=>m.Path).ToList()).ToList();
, но я хотел бы
Я хочу, чтобы сравнить 1-й список других 3 и найти, если существует повторяющийся путь.
Если ничего не найдено, я тогда хочу применить ту же логику сравнения второго списка и сравнить его с другим 2.
Если ничего не найдено, я тогда хочу применить ту же логику, сравнивающую третий список и сравнить его с последним.
Пожалуйста, обратите внимание, что я не хочу, пункт 1, 2 и 3 в одном процессе, как я хотел бы сообщить соответствующую ошибку, если дубликаты найдены.
Если я повторно использовать выше и добавить дополнительный Intersect
с дополнительным списком,
var list1 = settings.EmailFolders.Select(m => m.Path).ToList().
Intersect(settings.LogPaths.Select(m=>m.Path).ToList()).
Intersect(settings.SuccessPaths.Select(m=>m.Path).ToList()).
Intersect(settings.FailurePaths.Select(m=>m.Path).ToList()).List();
выше хотел бы нанесение and
оператора между собой, а не or
оператора, который не то, что я хочу. Мне нужно знать, если какой-либо из пути, используемого в FailurePaths или LogPaths или SuccessPaths уже используются в моей EmailFolder.Path
UPDATE:
Я обновил свой вопрос с ответом на основе @Devuxer предложения это правильный ответ, но вместо работы с строковым массивом я основываю его на списке классов, все из которых содержат свойство Path
.
List<EmailFolder> emailFolders = LoadEmailFolders();
List<LogPath> logPaths = LoadLogPaths();
List<SuccessPath> successPaths = LoadSuccessPaths();
List<FailurePath> failurePaths = LoadFailurePaths();
var pathCollisions = EmailFolders.Select(a=>a.Path)
.Intersect(LogPaths.Select(b=>b.Path))
.Select(x => new { Type = "LogPath", Path = x })
.Concat(EmailFolders.Select(c=>c.Path)
.Intersect(SuccessPaths.Select(d=>d.Path))
.Select(x => new { Type = "SuccessPath", Path = x }))
.Concat(EmailFolders.Select(e=>e.Path)
.Intersect(FailurePaths.Select(f=>f.Path))
.Select(x => new { Type = "FailurePath", Path = x })).ToList();
Обратите внимание, что в приведенном выше пример, для простоты, я только что объявил мой список с функцией для каждого, которые загружаются соответствующие данные, но в моем случае, все данные десериализируются и загружаются сразу.
Я должен попробовать то, что вы предложили. Это заставило меня улыбнуться :) с изумлением, как то, что можно сделать в linq, и как мало я до сих пор не знаю об этом предмете. Поистине удивительно! То, что у вас есть, выглядит хорошо, но вместо применения массивов строк я хочу применить это к списку объектов. – Thierry
@Thierry. Чтобы мой пример работал на вашу ситуацию, я думаю, что вы можете просто сделать 'new {Type =" Email-Log ", Path = x.Path} для каждого' нового' оператора. – devuxer
Отлично! Это сработало очарование! Я обновлю свой вопрос с ответом, где я использую список объектов, каждый из которых имеет свойство Path. Благодарю. – Thierry