【发布时间】:2015-06-23 17:50:54
【问题描述】:
我在某个文件夹结构中放置了多个文件。我必须在 List 集合中加载完整的文件级别详细信息。
文件夹结构:
/Servicer
/Mortgage
/008_Mortgage_00179C
/008_Mortgage_00179C_1.csv
/008_Mortgage_00179C_2.csv
/009_Mortgage_00180C
/009_Mortgage_00180C_1.csv
/009_Mortgage_00180C_2.csv
/Note
/006_Note_00194D
/006_Note_00194D_1.csv
/006_Note_00194D_2.csv
/007_Note_00194E
/007_Note_00194E_1.csv
/007_Note_00193F
/007_Note_00193F_1.csv
/IRS 1040
/005_IRS 1040_00872F
/005_IRS 1040_00872F_1.csv
/005_IRS 1040_00872F_2.csv
/Bank Statement
/0008_Bank Statement_0084H
/0008_Bank Statement_0084H_1.csv
/0008_Bank Statement_0084H_2.csv
/0008_Bank Statement_0084G
/0008_Bank Statement_0084G_1.csv
/0008_Bank Statement_0084G_2.csv
列表类型和结构是这样的:
List<Mstr_Batch_Data> lstFiles = new List<Mstr_Batch_Data>();
public class Mstr_Batch_Data
{
public string docType { get; set; }
public string docId { get; set; }
public string pcFilePath { get; set; }
public string ocrFilePath { get; set; }
public string status { get; set; }
}
现在在主列表中加载完整的数据集后,我必须根据一些条件/可配置值获取记录(可能在不同的列表中)。
只有两种配置:
- BatchType - 可以是相同的/不同的
- BatchSize - 可以是 1,n 或 ALL
我使用 LINQ 完成了第一部分,我能够加载完整的集合,
lstFiles = (from f in Directory.GetFiles(configuration.ocrFolderPath, "*", SearchOption.AllDirectories).ToList()
select new Mstr_Batch_Data
{
docType = Path.GetFileName(Path.GetDirectoryName(Path.GetDirectoryName(f))),
docId = Path.GetFileName(Path.GetDirectoryName(f)),
ocrFilePath = f,
pcFilePath = string.Concat(configuration.pcFolderPath, @"\",Path.GetFileName(Path.GetDirectoryName(Path.GetDirectoryName(f))),
@"\", Path.GetFileName(Path.GetDirectoryName(f)), @"\", Path.GetFileNameWithoutExtension(f),"_classifier.csv"),
status="Active"
}).ToList();
现在,进入流程的下一步,
如果 BatchType = SAME,并且 BatchSize = 2, 它应该返回所有记录,结构如下: (来自同一个 doctype 文件夹和前 2 个 DocID 文件夹中的所有文件,分批进入,依此类推)
/Batch 1
/008_Mortgage_00179C_1.csv
/008_Mortgage_00179C_2.csv
/009_Mortgage_00180C_1.csv
/009_Mortgage_00180C_2.csv
/Batch 2
/006_Note_00194D_1.csv
/006_Note_00194D_2.csv
/007_Note_00194E_1.csv
/Batch 3
/005_IRS 1040_00872F_1.csv
/005_IRS 1040_00872F_2.csv
/Batch 4
/0008_Bank Statement_0084H_1.csv
/0008_Bank Statement_0084H_2.csv
/0008_Bank Statement_0084G_1.csv
/0008_Bank Statement_0084G_2.csv
/Batch 5
/007_Note_00193F_1.csv
如果 BatchType = DIFFERENT 和 BatchSize = 2,那么来自不同 doctype 文件夹的所有文件和只有 2 个 DocId 文件夹应该放在一个批次中
/Batch 1
/008_Mortgage_00179C_1.csv
/008_Mortgage_00179C_2.csv
/006_Note_00194D_1.csv
/006_Note_00194D_2.csv
/Batch 2
/005_IRS 1040_00872F_1.csv
/005_IRS 1040_00872F_2.csv
/0008_Bank Statement_0084H_1.csv
/0008_Bank Statement_0084H_2.csv
/Batch 3
/009_Mortgage_00180C_1.csv
/009_Mortgage_00180C_2.csv
/007_Note_00194E_1.csv
/Batch 4
/0008_Bank Statement_0084G_1.csv
/0008_Bank Statement_0084G_2.csv
/007_Note_00193F_1.csv
因此,如果在 Master 列表上执行 LINQ,它采用 2 个配置并返回匹配的记录(将更复杂但更有效)。我不知道如何创建这个 LINQ。第二种方法是使用 for 循环,我正在尝试,但还没有。
lstBatchFiles = (List<String>)lstFiles.Select(o=>o.docId).Distinct();
bool flag = true;
for (int i = 0; i < lstBatchFiles.Count(); i++)
{
if (getConfig.batchType == "SAME")
{
lstFilePath = (from x in lstFiles
where x.docId.Equals(lstBatchFiles.ElementAt(i))
select new Mstr_Batch_Data
{
docId = x.docId,
docType = x.docType,
ocrFilePath = x.ocrFilePath,
pcFilePath = x.pcFilePath,
status = x.status
}).ToList();
if (tempDocType == lstFilePath.ElementAt(i).docType || tempDocType == null)
{
// check the no of docs configuration and increment
// create request object here
}
if (flag)
{
tempDocType = lstFilePath.ElementAt(i).docType;
flag = false;
}
}
else
{
// logic for Diffrent configuration
}
}
我理解这是一个复杂的问题,请随时评论/询问/更新。谢谢
【问题讨论】:
标签: c# linq list for-loop directory-structure