我有一个目录,其中所有不同版本的文件都可用。比如
ABC.pdfABC_1.pdf……
XYZ.tif。。。。。XYZ_25.tif
MNO.tiff
我想根据使用的要求制作n批m个文件。
假设文件夹中有ABC.pdf到ABC_24.pdf&XYZ.tif到XYZ_24.tif文件。总共50个文件。我想创建两个批次,每个批次25个文件。因此,首先(我/如何)需要确保列表中的所有文件都经过排序,然后我可以执行一些逻辑,将列表划分为两个适当的批次
1) ABC.pdf至ABC_24.pdf
2) XYZ.tif到XYZ_24.tif
但如果我有26个文件(如开头所述),那么它将像
1) ABC.pdf至ABC_24.pdf
2) XYZ.tif到XYZ_24.tif
3) ABC_25.pdf和XYZ_25.tif
因此,我希望在这里正确/有意义地批量分配文件。我更愿意尽可能少地表演。所以,我尝试了如下lambda表达式:
List<string> strIPFiles = Directory.GetFiles(folderPath, "*.*").
Where(file => file.ToLower().EndsWith("tiff") || file.ToLower().EndsWith("tif") || file.ToLower().EndsWith("pdf")).ToList();
int batches = 2, filesPerBatch = 25; //for example
我需要使用-strIPFiles.Sort()吗;它在任何情况下都有用吗?还是我总是得到文件的排序列表?
如何从列表中创建批处理-使用lambda表达式,正如我上面所表达的那样?
谢谢你的帮助。
不确定我是否完全理解你的问题。我假设您正在寻找一种方法,将文件划分为指定大小的批(如文件数),并且您还希望它们根据文件名进行分组。
如果这有帮助,请告诉我:
public static void CreateBatch(int batchSize)
{
string sourcePath = @"C:UsershariDesktoptest";
var pdfs = Directory.EnumerateFiles(sourcePath, "*.pdf", SearchOption.TopDirectoryOnly);
var tiffs = Directory.EnumerateFiles(sourcePath, "*.tiff", SearchOption.TopDirectoryOnly);
var images = pdfs.Union(tiffs);
var imageGroups = from image in images
group image by Regex.Replace(Path.GetFileNameWithoutExtension(image), @"_d+$", "") into g
select new { GroupName = g.Key, Files = g.OrderBy(s => s) };
List<List<string>> batches = new List<List<string>>();
List<string> batch = new List<string>();
foreach (var group in imageGroups)
{
batch = batch.Union(group.Files).ToList<string>();
if (batch.Count >= batchSize)
{
batches.Add(batch);
batch = new List<string>();
}
}
}