基于其他列合并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并引入两个新列(即startDate
和EndDate
(将它们合并为一条记录,预期结果如下
预期结果
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
从上面的数据可以看出,我有两个新列,名为StartDate
和EndDate
,而不是用于获取StartDate
和EndDate
值的Term
Column。此外,最后一行中的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;
}
我能知道解决这个问题的好方法吗
如果卖家和买家与您在帖子中展示的示例相同,您需要这样的东西:
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。