如何删除已在 .Take() 中处理的数组列表中的 FileInfo
How to remove FileInfo in Array List that already processed in .Take()
这是代码:
// Files has 25 PDF
var Files = Folder.GetFileToPublicFolder(Folder.srcFolder);
foreach (FileInfo file in Files)
{
// Get 10 PDF in Files
List<FileInfo> files = Files.Take(10).ToList();
// Process the 10 PDF
foreach (var item in files)
{
File.Move(Path.Combine(Folder.srcFolder, item.Name), Path.Combine(Folder.tmpFolder, item.Name));
}
files = null;
ProcessParallelThread(e);
}
我有 Public 个包含 25 个 PDF 文件的文件夹。
使用这个
List<FileInfo> files = Files.Take(10).ToList();
它将获取 1 - 10 PDF 并进行处理。在处理 1 - 10 PDF 之后,当 foreach 再次循环时,它采用相同的 1 - 10 PDF 而不是 11 - 20 PDF .
如何获取 List<> 中的其他 PDF?
提前致谢!
在你的第一个循环之后,你必须调用:
files = Files.Skip(10).Take(10).ToList();
我正在使用您的代码并进行了一些更改以使其适用于超过 20 个文件(如果您需要)。
// Files has 25 PDF
var Files = Folder.GetFileToPublicFolder(Folder.srcFolder);
int _skip = 0;
foreach (FileInfo file in Files)
{
// Get 10 PDF in Files
List<FileInfo> files = Files.Skip(_skip).Take(10).ToList();
// Process the 10 PDF
foreach (var item in files)
{
File.Move(Path.Combine(Folder.srcFolder, item.Name), Path.Combine(Folder.tmpFolder, item.Name));
}
files = null;
ProcessParallelThread(e);
_skip = _skip + 10;
}
希望它对你有用。
Take 顾名思义只取 10 个元素(前 10 个更具体),如果你不告诉它,第二个 take 调用就不可能取不同的 10 个元素。
如果你想处理 10 个元素的块,我建议创建一个进行拆分的方法(关注点分离)
这是我用的:
public static class EnumerableExtensions
{
[Pure]
public static IEnumerable<T[]> Split<T>(this IEnumerable<T> source, int chunkSize)
{
T[] sourceArray = source as T[] ?? source.ToArray();
for (int i = 0; i < sourceArray.Length; i += chunkSize)
{
T[] chunk = new T[chunkSize + i > sourceArray.Length ? sourceArray.Length - i : chunkSize];
Array.Copy(sourceArray, i, chunk, 0, chunk.Length);
yield return chunk;
}
}
}
现在你有了一个拆分方法,可以像这样使用
var files = Folder.GetFileToPublicFolder(Folder.srcFolder);
foreach(var chunk in files.Split(10))
{
//....
}
这是代码:
// Files has 25 PDF
var Files = Folder.GetFileToPublicFolder(Folder.srcFolder);
foreach (FileInfo file in Files)
{
// Get 10 PDF in Files
List<FileInfo> files = Files.Take(10).ToList();
// Process the 10 PDF
foreach (var item in files)
{
File.Move(Path.Combine(Folder.srcFolder, item.Name), Path.Combine(Folder.tmpFolder, item.Name));
}
files = null;
ProcessParallelThread(e);
}
我有 Public 个包含 25 个 PDF 文件的文件夹。
使用这个
List<FileInfo> files = Files.Take(10).ToList();
它将获取 1 - 10 PDF 并进行处理。在处理 1 - 10 PDF 之后,当 foreach 再次循环时,它采用相同的 1 - 10 PDF 而不是 11 - 20 PDF .
如何获取 List<> 中的其他 PDF?
提前致谢!
在你的第一个循环之后,你必须调用:
files = Files.Skip(10).Take(10).ToList();
我正在使用您的代码并进行了一些更改以使其适用于超过 20 个文件(如果您需要)。
// Files has 25 PDF
var Files = Folder.GetFileToPublicFolder(Folder.srcFolder);
int _skip = 0;
foreach (FileInfo file in Files)
{
// Get 10 PDF in Files
List<FileInfo> files = Files.Skip(_skip).Take(10).ToList();
// Process the 10 PDF
foreach (var item in files)
{
File.Move(Path.Combine(Folder.srcFolder, item.Name), Path.Combine(Folder.tmpFolder, item.Name));
}
files = null;
ProcessParallelThread(e);
_skip = _skip + 10;
}
希望它对你有用。
Take 顾名思义只取 10 个元素(前 10 个更具体),如果你不告诉它,第二个 take 调用就不可能取不同的 10 个元素。
如果你想处理 10 个元素的块,我建议创建一个进行拆分的方法(关注点分离)
这是我用的:
public static class EnumerableExtensions
{
[Pure]
public static IEnumerable<T[]> Split<T>(this IEnumerable<T> source, int chunkSize)
{
T[] sourceArray = source as T[] ?? source.ToArray();
for (int i = 0; i < sourceArray.Length; i += chunkSize)
{
T[] chunk = new T[chunkSize + i > sourceArray.Length ? sourceArray.Length - i : chunkSize];
Array.Copy(sourceArray, i, chunk, 0, chunk.Length);
yield return chunk;
}
}
}
现在你有了一个拆分方法,可以像这样使用
var files = Folder.GetFileToPublicFolder(Folder.srcFolder);
foreach(var chunk in files.Split(10))
{
//....
}