使用LINQ查询列表

时间:2013-12-19 12:57:01

标签: c# linq list

我在一个文本文件中有一个如下所示的列表,我使用 StreamReader.ReadLine 读入了一个字符串列表:

CSAclsEN    001 \\sgprt\Projects2   001 CSAclsEN-2010-1130227   10:42   27Feb13 2010    Southgate Branch    SS01    001 ****69  Steve Suttill   
01  ******10    Business Current Account    GBP 2,342,188.38    
02  27Feb13 Cheque Cashed   700.00- 
02  27Feb13 Cheque Cashed   25.00-  
02  27Feb13 Cheque Cashed   1,000.00-   
02  27Feb13 Cheque Cashed   1,000.00-   
02  27Feb13 CHS 4123-690069-100 20.00-  
01  ******11    Personal Current Account    GBP 22,456.80   
02  27Feb13 Cash Withdrawn  100.00- 
02  27Feb13 TFR 130227SS0100103 1,000.00    
02  27Feb13 TFR 130227SS0100091 1,234.56    
02  27Feb13 TFR 130227SS0100066 2,222.22    
02  27Feb13 TFR 130227SS0100064 0.01    

我想做的是:

  1. 输出第一行作为迷你语句标题
  2. 每次行中的前两个字符 01 我将输出该帐户的标题信息
  3. 后面是 02 行的格式化列表,直到下一行 01 ,我将再次输出标题信息,依此类推。
  4. (这是出纳员申请中的客户迷你声明)

    我使用Office.Interop

    将其写入MS Word模板

    LINQ是分离不同类型记录的最佳方式,我该怎么做?

    输出(在MS Word模板中)将是这样的 - 但没有边框

    enter image description here

    模板只有前两个(,第二个表在日期下只有一行开头,并且会有一个可变数量的帐户(以 02 开头)因此,每次代码遇到 02 时,您在图片中看到的第二个表格都会被复制,或者可能是新表格添加了相同的列并为每行添加了一行wityh 01

    模板在开头看起来像这样: enter image description here

    当遇到 01 的每一行时,会在下面添加一个新行,然后遇到 02 的行时,会启动一个新表。

    更多信息: 这是对已经处理类似列表但只有一个帐户进行交易的现有应用程序的增强。

    目前,我通过在字典中映射键值对来替换“{}”字段,然后开始处理这样的事务:

    int iRow=1;
    
    for (int s = 1; s < pqRequests.Count; s++)
        {                                                                              
        string[] sValues = pqRequests[s].Split('\t');
    
        // Transaction List
        for (int iDx = 2; iDx <= 5; iDx++)
            {
            oWordDoc.Tables[2].Cell(iRow, iDx).Range.Text = sValues[iDx - 1];
            }
        }
    
        oWordDoc.Tables[2].Rows.Add(ref oMissing);                                            
        iRow++;
        }
    

    现在,我想在同一程序中继续处理帐户列表迷你声明,但我不确定最佳方法前进

1 个答案:

答案 0 :(得分:3)

我不认为LINQ将是最可靠的选择。
只需使用经典循环就可以提高可维护性:

var groupResults = new List<Tuple<string, List<string>>>();
List<string> subLines = null;
foreach(var line in lines)
{
    if(line.StartsWith("01"))
    {
        subLines = new List<string>();
        groupResults.Add(Tuple.Create(line, subLines));
    }
    // consider to handle the case where a line begin with 02 with no 01 before
    else if(subLines != null && line.StartsWith("02"))
    {
        subLines.Add(line);
    }
}

您的结果按标题分组,并且02对应的列表 您现在可以根据此列表列表轻松进行格式化。