我有一个包含文件路径的字符串列表。
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");
现在我需要从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();
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;
}
}
答案 0 :(得分:8)
allFilesWithPathList.Where(path => !allFileNamesOnlyList.Contains(Path.GetFileName(path));
这里有两项改进。
Path.GetFileName
比自己拆分路径要好得多。IEnumerable.Where
与ICollection.Contains
一起以简洁易读的方式实际查询列表。答案 1 :(得分:4)
这应该有效
allFilesWithPathList.Where(x => !excludeList.Any(y => x.EndsWith(y)))