除了LINQ中的LIKE条件

本文关键字:条件 LIKE 中的 LINQ 除了 | 更新日期: 2023-09-27 18:03:44

我有一个字符串列表,其中包含文件路径。

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;

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

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

现在,我需要从excludeList中不存在的allFilesWithPathList中获取文件。目前,在创建了另一个仅包含文件名的列表后,我正在使用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();

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;
    }
}

除了LINQ中的LIKE条件

allFilesWithPathList.Where(path => !allFileNamesOnlyList.Contains(Path.GetFileName(path));

这里有两个改进。

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

这应该能在中工作

allFilesWithPathList.Where(x => !excludeList.Any(y => x.EndsWith(y)))