首页 / C# / 基于其他列合并C#列表中一列的多行
基于其他列合并C#列表中一列的多行
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了基于其他列合并C#列表中一列的多行,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2842字,纯文字阅读大概需要5分钟。
内容图文
我有一个通用的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.
同样,最后一行的数量发生变化,这是特定ID的所有数量之和,即ID重复的次数*数量
在这里,我有两种情况要解决
情况1:
如果只有一个特定ID的记录说是1000,则StartDate将是Term列中的每月的第一天,而EndDate将是Term列中的每月的最后一天,即08/01/2015和08/31/2015.
数量不变
情况2:
如果有一个特定ID的多个记录,例如1002(所有术语将按顺序排列),则StartDate将是最小月份的第一天,即06/01/2015,而EndDate将是Term列中最高月份的最后一天即2015年8月31日.
数量=编号重复ID的次数*数量,即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)
}
});
本质上,我们将结果分组(列表包含您的结果).我们如何构造StartDate和EndDate就完成了.在那里,我们对同一组中的行进行排序,然后得到第一个,以获取StartDate的字符串表示形式.然后,我们使用DateTime.ParseExact方法,因为我们知道DateTime的确切格式.就EndDate而言,我们进行一个OrderByDescending,以便获得最后一个日期-我们可以进行OrderBy并获取最后一个元素,它是等效的.然后,我们再次应用DateTime.ParseExact.
内容总结
以上是互联网集市为您收集整理的基于其他列合并C#列表中一列的多行全部内容,希望文章能够帮你解决基于其他列合并C#列表中一列的多行所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。