gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:06:54 25 4
gpt4 key购买 nike

我有一个通用的 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

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

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

案例一:如果特定的 ID 只有一条记录比如说,1000然后StartDate将是 Term 列中月份的第一天,EndDate 将是 Term 中月份的最后一天即08/01/2015 and 08/31/2015 .Quantity没有变化

案例2:如果一个特定的 ID 有多个记录说 1002 (所有术语将按顺序排列)然后 StartDate将是最小月份的第一天,即 06/01/2015 EndDate 将是 Term 列最高月份的最后一天,即 08/31/2015。 Quantity=No.Of times ID repeated*Quantity20*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)
}
});

本质上,我们对结果进行分组(列表包含您的结果)。诀窍在于我们如何构造 StartDateEndDate。在那里,我们对同一组中的行进行排序,我们得到第一行以获得 StartDate 的字符串表示形式。然后我们使用 DateTime.ParseExact 方法,因为我们知道 DateTime 的确切格式。至于 EndDate,我们创建一个 OrderByDescending,以便我们获得最后一个日期 - 我们可以创建一个 OrderBy 并获取最后一个元素,这是等效的。然后我们再次应用 DateTime.ParseExact。

关于c# - 基于其他列合并 C# 列表中一列的多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31595452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com