【问题标题】:Create a LINQ for the List<> to fetch records based on conditional parameters为 List<> 创建一个 LINQ 以根据条件参数获取记录
【发布时间】: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


    【解决方案1】:

    我认为这会起作用,但尚未测试...

    //Add a property in Mstr_Batch_Data class for the DocFolder number : DocFolderId (and maintain it using an auto number 1,2,3 etc while populating)
    
    //define an enumeration => enum Filters{Same, Different}
    
    var size=2; //provide size
    var filter=Filters.Same; //provide filter
    //var docTypes=lstFiles.GroupBy(f=>f.docType).Select(g=>g.Key);
    var files = lstFiles.GroupBy(f=>f.DocFolderId%(size+1)==0).ToList();
    var batches = files.GroupBy(f=> ((filter== Filters.Same && f.docType)
                                       || (filter== Filters.Different && 1);
    

    【讨论】:

    • 我这里有两个问题,["f.docType" 在最后一行,f 将不包含 docType 的定义] 和 [&& 不能应用于 bool/int]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 2021-09-23
    • 2010-09-11
    • 1970-01-01
    相关资源
    最近更新 更多