LINQ 查询不选择文件
LINQ Query Not Selecting Files
我正在尝试使用 LINQ 查询一组文件,我可以在其中找到包含特定字符串的文件名。
我正在使用:
var docs = directory.enumerateFiles(searchFolder, "* " + strNumber+ "*", SearchOption.AllDirectories);
这工作正常,但由于其中一个目录有超过 100 万个文件,我的一些文件搜索花费了 30 多分钟。我希望通过 PLINQ 查询加快搜索过程。然而,虽然我的语法很好,但我没有得到我期望的结果。看起来我的问题可能出在 Where 语句中。任何帮助都会有所帮助。
foreach (strNumber in strNumbers)
{
DirectoryInfo searchDirectory = new DirectoryInfo(searchFolder);
IEnumerable<System.IO.FileInfo> allDocs = searchDirectory.EnumerateFiles("*", SearchOPtion.AllDirectories);
IEnumerable<System.IO.FileInfo> docsToProcess = strNumbers
.SelectMany(strNumber => allDocs
.Where(file => file.Name.Contains(strNumber)))
.Distinct();
}
如有任何帮助,我们将不胜感激。
我会改变问题的顺序。
- 创建所有文件的列表(存入内存)
- 对内存列表执行搜索
然后,您可以在内存阵列上使用并行 Foreach,并且您的磁盘使用仅限于初始搜索。
var searchDirectory = new DirectoryInfo(searchFolder);
var allDocs = searchDirectory.EnumerateFiles("*", SearchOPtion.AllDirectories).ToArray();
// For extra points, use a Parallel.ForEach here for multi-threaded work
Parallel.Foreach(strNumbers, strNumber =>
{
// Work on allDocs here, it should be in memory
});
我正在尝试使用 LINQ 查询一组文件,我可以在其中找到包含特定字符串的文件名。
我正在使用:
var docs = directory.enumerateFiles(searchFolder, "* " + strNumber+ "*", SearchOption.AllDirectories);
这工作正常,但由于其中一个目录有超过 100 万个文件,我的一些文件搜索花费了 30 多分钟。我希望通过 PLINQ 查询加快搜索过程。然而,虽然我的语法很好,但我没有得到我期望的结果。看起来我的问题可能出在 Where 语句中。任何帮助都会有所帮助。
foreach (strNumber in strNumbers)
{
DirectoryInfo searchDirectory = new DirectoryInfo(searchFolder);
IEnumerable<System.IO.FileInfo> allDocs = searchDirectory.EnumerateFiles("*", SearchOPtion.AllDirectories);
IEnumerable<System.IO.FileInfo> docsToProcess = strNumbers
.SelectMany(strNumber => allDocs
.Where(file => file.Name.Contains(strNumber)))
.Distinct();
}
如有任何帮助,我们将不胜感激。
我会改变问题的顺序。
- 创建所有文件的列表(存入内存)
- 对内存列表执行搜索
然后,您可以在内存阵列上使用并行 Foreach,并且您的磁盘使用仅限于初始搜索。
var searchDirectory = new DirectoryInfo(searchFolder);
var allDocs = searchDirectory.EnumerateFiles("*", SearchOPtion.AllDirectories).ToArray();
// For extra points, use a Parallel.ForEach here for multi-threaded work
Parallel.Foreach(strNumbers, strNumber =>
{
// Work on allDocs here, it should be in memory
});