除LINQ中的LIKE条件外

LCJ*_*LCJ 9 c# 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;
Run Code Online (Sandbox Code Playgroud)

我有另一个列表,其中包含文件的子集 - 但它只有文件名; 不是路径.

List<string> excludeList = new List<string>();
excludeList.Add("B.sql");
Run Code Online (Sandbox Code Playgroud)

现在我需要从allFilesWithPathList获取excludeList中不存在的文件.目前,我EXCEPT在创建另一个仅包含文件名的列表后,正在执行以下操作.

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();
Run Code Online (Sandbox Code Playgroud)

在LINQ不引入上述其他列表的情况下,使这种逻辑工作的最佳方法是什么?

注意:我正在使用 .Net 4.5

完整的代码

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Geo*_*son 8

allFilesWithPathList.Where(path => !allFileNamesOnlyList.Contains(Path.GetFileName(path));
Run Code Online (Sandbox Code Playgroud)

这里有两个改进.

  1. Path.GetFileName 比自己拆分路径要好得多.
  2. IEnumerable.Where结合ICollection.Contains实际以简洁易读的方式查询列表.


Joe*_*Joe 4

这应该有效

allFilesWithPathList.Where(x => !excludeList.Any(y => x.EndsWith(y)))
Run Code Online (Sandbox Code Playgroud)