基于其他列合并C#列表中一列的多行

本文关键字:一列 合并 于其他 其他 列表 | 更新日期: 2023-09-27 18:04:15

我有一个通用的C#列表List<Result>结果,它有几个字段,其中有几行数据,类型为RESULT

public class Result
{
    public int TrdID;
    public string Term;
    public double Price;
    public string Seller;
    public string Buyer;
    public bigint Quantity;
}

数据如下

TrdID    Term      Price  Seller Buyer  Quantity
1000     201508      1     ABC    XYZ   10
1010     201508      2      ACB   PQR   10
1002     201507      1.5   ABX    PEW   20 
1002     201506      1.5   ABX    PEW   20
1002     201508      1.5   ABX    PEW   20

现在,我想处理上面的数据,并为为特定的ID提供的单个唯一的ID返回单个,除了Term之外,所有列都是相同的。例如,我有三条ID 1002记录,我想通过将Term转换为DateTime并引入两个新列(即startDateEndDate(将它们合并为一条记录,预期结果如下

预期结果

   TrdID     StartDate     EndDate      Price  Seller Buyer  Quantity
    1000     08/01/2015    08/31/2015    1      ABC    XYZ   10
    1010     08/01/2015    08/31/2015    2      ACB    PQR   10
    1002     06/01/2015    08/31/2015    1.5    ABX    PEW   60 

从上面的数据可以看出,我有两个新列,名为StartDateEndDate,而不是用于获取StartDateEndDate值的TermColumn。此外,最后一行中的Quantity发生了变化,它是特定ID的所有数量的总和,即No.Of times ID repeated*Quantity

这里,我有两个案例来解决

情况1:如果特定的ID(例如1000(只有一条记录,则StartDate将是Term列中当月的第一天,EndDate将是Term(即08/01/2015 and 08/31/2015(中当月的最后一天。Quantity 无变化

情况2:如果一个特定的ID(比如1002(有多条记录(所有术语都将按顺序排列(,则StartDate将是最短月份的第一天,即06/01/2015和EndDate将是术语列最高月份的最后一天,即2015年8月31日。Quantity=No.Of times ID repeated*Quantity,即20*3=60

我的结果列表将是类型

public class ProcessedResult
{
    public int TrdID;
    public DateTime StartDate;
    public DateTime EndDate;
    public double Price;
    public string Seller;
    public string Buyer;
    public bigint Quantity;
}

我能知道解决这个问题的好方法吗

基于其他列合并C#列表中一列的多行

如果卖家和买家与您在帖子中展示的示例相同,您需要这样的东西:

var result = list.GroupBy( result => result.TrdID)
                 .Select( gr => {
                 var startDate = DateTime.ParseExact(gr.OrderBy(x => x.Term).First().Term, "yyyyMM", CultureInfo.InvariantCulture);
                 var endDate = DateTime.ParseExact(gr.OrderByDescending(x => x.Term).First().Term, "yyyyMM", CultureInfo.InvariantCulture);                      
                 return  new ProcessedResult
                 {
                     TrdID = gr.Key
                     StartDate = new DateTime(startDate.Year, startDate.Month, 1),
                     EndDate = (new DateTime(endDate.Year, endDate.Month, 1)).AddMonth(1).AddDays(-1),
                     Price = gr.First().Price,
                     Seller = gr.First().Seller,
                     Buyer = gr.First().Buyer,
                     Quantity = gr.Sum(x=>x.Quantity)
                 } 
             });

从本质上讲,我们根据结果进行分组(列表包含您的结果(。介绍了CCD_ 28和CCD_。在那里,我们对同一组中的行进行排序,并获得第一个行,以便获得StartDate的字符串表示。然后我们使用DateTime.ParseExact方法,因为我们知道DateTime的确切格式。就EndDate而言,我们制作了一个OrderByDescending,为了获得最后一个日期——我们可以制作一个OrderBy并获得最后的元素,这是等价的。然后我们再次应用DateTime.ParseExact。