2016-08-23 13 views
9

Mam listę ciągów, które przechowuje ścieżki plików.Z wyjątkiem LIKE warunku w LINQ

List<string> allFilesWithPathList = new List<string>(); 

allFilesWithPathList.Add(@"G:\Test\A.sql"); 
allFilesWithPathList.Add(@"G:\Test\B.sql"); 
allFilesWithPathList.Add(@"G:\Test\C.sql"); 

return allFilesWithPathList; 

Mam inną listę, która przechowuje podzbiór plików - ale ma tylko nazwę pliku; nie ścieżkę.

List<string> excludeList = new List<string>(); 
excludeList.Add("B.sql"); 

Teraz potrzebuję uzyskać pliki z allFilesWithPathList, które nie są obecne w excludeList. Obecnie wykonuję następujące czynności, używając EXCEPT, po utworzeniu kolejnej listy tylko z nazwami plików.

List<string> allFileNamesOnlyList = new List<string>(); 
foreach (string fileNameWithPath in allFilesWithPathList) 
{ 
    //Remove path and get only file name 
    int pos = fileNameWithPath.LastIndexOf(@"\") + 1; 
    string value = fileNameWithPath.Substring(pos, fileNameWithPath.Length - pos); 
    allFileNamesOnlyList.Add(value); 
} 

//EXCEPT logic 
List<string> eligibleListToProcess = allFileNamesOnlyList.Except(excludeList).ToList(); 

Jaki jest najlepszy sposób, aby uzyskać w LINQ tę logikę roboczą bez wprowadzania innej listy, jak wyżej?

Uwaga: Używam .Net 4.5

kompletny kod

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<string> allFilesWithPathList = GetAllFilesWithPath(); 

     List<string> excludeList = new List<string>(); 
     excludeList.Add("B.sql"); 

     List<string> allFileNamesOnlyList = new List<string>(); 
     foreach (string fileNameWithPath in allFilesWithPathList) 
     { 
      //Remove path and get only file name 
      int pos = fileNameWithPath.LastIndexOf(@"\") + 1; 
      string value = fileNameWithPath.Substring(pos, fileNameWithPath.Length - pos); 
      allFileNamesOnlyList.Add(value); 
     } 

     //EXCEPT logic 
     List<string> eligibleListToProcess = allFileNamesOnlyList.Except(excludeList).ToList(); 

     //Print all eligible files 
     foreach (string s in eligibleListToProcess) 
     { 
      Console.WriteLine(s); 
     } 
     Console.ReadLine(); 
    } 

    public static List<string> GetAllFilesWithPath() 
    { 
     List<string> allFilesWithPathList = new List<string>(); 

     allFilesWithPathList.Add(@"G:\Test\A.sql"); 
     allFilesWithPathList.Add(@"G:\Test\B.sql"); 
     allFilesWithPathList.Add(@"G:\Test\C.sql"); 

     return allFilesWithPathList; 
    } 
} 

Odpowiedz

4

To powinno działać

allFilesWithPathList.Where(x => !excludeList.Any(y => x.EndsWith(y))) 
8
allFilesWithPathList.Where(path => !allFileNamesOnlyList.Contains(Path.GetFileName(path)); 

Istnieją dwa ulepszenia tutaj.

  1. Path.GetFileName jest znacznie lepszy niż samodzielne rozdzielenie ścieżki.
  2. IEnumerable.Where w połączeniu z ICollection.Contains, aby wyświetlić listę w sposób zwięzły i łatwy do odczytania.
Powiązane problemy