如何删除已在 .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))
{
   //....
}