2016-12-31 2 views
1

Рассмотрят переменный ток # List<string> files следующего содержаниемСоздать новый список <string> основанных на подстроке в списке <string> в C#

C:\z1\z1.docx 
C:\z1\z2.docx 
C:\z2\z2.docx // <--- file z2.docx has the same name as in folder z1. 

теперь я хочу, чтобы найти все файлы с таким же файлом и получить обратно список, который содержит полный путь + имя файла

List<string> duplicates

C:\z1\z2.docx 
C:\z2\z2.docx 

Я спрашиваю, так как легко закодировать решение с петлями и другими неэффективными способами, но я хочу использовать элегантное решение, а моего знания операций List в C# недостаточно.

+1

Использовать 'LINQ' – ViVi

ответ

4

Я не уверен, что вы делаете петли неэффективными - это то, что LINQ будет делать под обложками в любом случае. Но если вы хотите использовать LINQ вы можете добиться того, что с помощью пары вызовов метода:

var result = files.GroupBy(p => Path.GetFileName(p)) 
        .Where(g => g.Count() > 1) 
        .SelectMany(g => g); 

Это группа по имени файла первым, удалите все группы только один элемент и придавить оставшиеся группы в одну коллекцию путей.

Вы можете добавить вызов ToList после SelectMany, чтобы внести материальный платеж в List<string>.

+1

Downvoters позабыть прокомментировать? Он возвращает точно то, что ожидает OP на основе ввода/вывода выборки. – MarcinJuraszek

2
List<string> duplicates = new List<string>() { @"C:\z1\z1.docx", 
              @"C:\z1\z2.docx", @"C:\z2\z2.docx" }; 
     List<dynamic> GetList(List<string> FilesToCheck) 
     { 
      var Files = from file in FilesToCheck 
         where duplicates.Contains(file) 
         select new { FileName = new FileInfo(file).Name, FullName  
         = new FileInfo(file).FullName }; 
      return Files.ToList(); 
     } 
+0

'где duplicates.Contains (file)' всегда будет true, потому что 'file' берется из' duplicates' для начала. – MarcinJuraszek

+0

Это будет верно для файлов, содержащихся в предоставленном списке. Это то, о чем он просил, и элегантно. Ваше решение тоже хорошо. –

+1

Извините, но я думаю, вы меня неправильно поняли. Это всегда будет ** истинно, потому что вы повторяете элементы в списке, а затем проверяете, присутствует ли этот элемент ** в том же ** списке. Вы просто приняли его в список, поэтому он должен быть там ... – MarcinJuraszek