【发布时间】:2023-03-09 18:31:01
【问题描述】:
我有这个数据表:
DataTable dt = new DataTable();
dt.Columns.Add("BBG IPC code", typeof(double));
dt.Columns.Add("Issuer Group", typeof(string));
dt.Columns.Add("Seniority", typeof(string));
dt.Columns.Add("Nom Value", typeof(double));
dt.Columns.Add("Mkt Value", typeof(double));
dt.Columns.Add("Rating", typeof(string));
dt.Columns.Add("Sector", typeof(string));
dt.Columns.Add("Analyst", typeof(string));
dt.Rows.Add(new object[] { 117896, "Financiere", "Senior", 101, 20000.76, "BB", "Materials", "BAETZ" });
dt.Rows.Add(new object[] { 117896, "Financiere", "Senior", 356, 300500, "BBB", "Materials", "BAETZ" });
dt.Rows.Add(new object[] { 117896, "Financiere", "Senior", 356, 30000, "BBB", "Energy", "BAETZ" });
dt.Rows.Add(new object[] { 117896, "Financiere", "Covered", 4888, 10000, "BB", "Energy", "BAETZ" });
dt.Rows.Add(new object[] { 117896, "Financiere", "Covered", 645, 50000, "BBB", "Energy", "BAETZ" });
dt.Rows.Add(new object[] { 117897, "Scentre Group", "Senior", 46452, 51066.5, "AA", "Energy", "BAETZ" });
dt.Rows.Add(new object[] { 117898, "Vereniging Achmea", "Senior", 778, 90789.9, "C", "Insurance", "BAETZ" });
dt.Rows.Add(new object[] { 117898, "Vereniging Achmea", "Senior", 7852, 10055.66, "C", "Utilities", "BAETZ" });
对于BBG IPC code 和Seniority 的每一对值,我需要检查Rating 和Sector 列的值是否相同,如果相同,则合并这些行并将@ 的值相加987654326@ 和Nom Value。
相反,如果一个或两个不相同,我需要选择具有最高值的行Mkt Value(如果值相等,只需取 1 行)并丢弃其他行但在列 Mkt Value 和Nom Value 我仍然需要所有行的总和。
例如:对于代码中的 BBG IPC code 数字 117896,Rating 和 Sector 的值不同,我需要最高值为 Mkt Value 的行(第二行 300500)并丢弃其他 2 Mkt Value 较低的行,但在丢弃它们之前,我需要将 300500+20000+30000 和 356+356+101 相加。
结果是 {117896,"Financiere","Senior",813,350500,"BBB", "Materials", "BAETZ"}
我已经尝试过类似的方法,但是有一个错误告诉我不能在 CopyToDataTable 中放入一个引用字段“Seniority”的字符串值...
DataTable maxIPC_Seniority = dt.AsEnumerable()
.OrderByDescending(x => x.Field<double>("Mkt Value"))
.GroupBy(x => x.Field<double>("IPC"), x => x.Field<string>("Seniority"))
.Select(x => x.FirstOrDefault())
.CopyToDataTable();
仍然是对丢弃的行求和的问题。谢谢你的帮助。
【问题讨论】:
-
您将
"Seniority"指定为元素选择器,因此您得到的只是string字段的集合,因此.Select(x => x.FirstOrDefault())选择的是string,而不是@ 987654341@.