[英]How to group Similar DataTable Items and show in One Row with aggregation values?
我有像波纹管这样的数据表值,现在我想根据第二列的值将这些值分组为“一行”,并能够像波纹管那样计算总计。 任何想法都可以分享。
所需的格式数据,例如波纹管
1KT049014L1(F),L2(F),R1(F),R2(F)Ghoousunnisa(F)9999999999 Nellore 2200 220 1980 APIEasyBus Agent
实际数据格式
1 KT049014 L1 Ghoousunnisa(F)9999999999 Nellore 550 55495 API EasyBus代理
2 KT049014 L2 Ghoousunnisa(F)9999999999 Nellore 550 55495 API EasyBus代理
3 KT049014 R1 Ghoousunnisa(F)9999999999 Nellore 550 55495 API EasyBus代理
4 KT049014 R2 Ghoousunnisa(F)9999999999 Nellore 550 55495 API EasyBus代理
static void Main(string[] args)
{
var dt = new DataTable();
dt.Columns.Add("A", typeof(int));
dt.Columns.Add("B", typeof(string));
dt.Columns.Add("C", typeof(string));
dt.Columns.Add("D", typeof(string));
dt.Columns.Add("E", typeof(string));
dt.Columns.Add("F", typeof(string));
dt.Columns.Add("G", typeof(string));
dt.Columns.Add("H", typeof(decimal));
dt.Columns.Add("I", typeof(decimal));
dt.Columns.Add("J", typeof(decimal));
dt.Columns.Add("K", typeof(string));
dt.Columns.Add("L", typeof(string));
dt.Columns.Add("M", typeof(string));
dt.Rows.Add(1, "KT049014", "L1", "Ghoousunnisa", "(F)", "9999999999", "Nellore", 550, 55, 495, "API", "EasyBus", "Agent");
dt.Rows.Add(2, "KT049014", "L2", "Ghoousunnisa", "(F)", "9999999999", "Nellore", 550, 55, 495, "API", "EasyBus", "Agent");
dt.Rows.Add(3, "KT049014", "R1", "Ghoousunnisa", "(F)", "9999999999", "Nellore", 550, 55, 495, "API", "EasyBus", "Agent");
dt.Rows.Add(4, "KT049014", "R2", "Ghoousunnisa", "(F)", "9999999999", "Nellore", 550, 55, 495, "API", "EasyBus", "Agent");
var datas =
dt.AsEnumerable()
.GroupBy(row => row[1])
.Select((group, i) => new {A = i + 1, B = group.Key, Others = combine(dt.Columns, group)});
var result = dt.Clone();
foreach (var d in datas)
{
var row = result.Rows.Add(d.A, d.B);
for (int i = 0; i < d.Others.Count(); i++)
row[i + 2] = d.Others.ElementAt(i);
}
}
private static IEnumerable<object> combine(DataColumnCollection columns, IGrouping<object, DataRow> group)
{
for (int i = 2; i < columns.Count; i++)
{
if (columns[i].DataType == typeof(string))
yield return string.Join(",", group.Select(r => r.Field<string>(i)).Distinct());
else
yield return group.Sum(r => r.Field<decimal>(i));
}
}
}
L1(F),L2(F),R1(F),R2(F):
string.Join(",", group.Select(r=>string.Concat(r[2], r[4])))
Ghoousunnisa(F)9999999999 Nellore APIEasyBus代理商:
(我不知道他们在小组中是否总是一样)
string.Join(",", group.Select(r=>r.Field<string>("D")))
string.Join(",", group.Select(r=>.Field<string>("D")).Distinct())
group.Select(r=>r.Field<string>("D")).First()
2200 220 1980:
group.Sum(r=>r.Field<decimal>("I"))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.