what way that make me able to group by 2 columns and get MAX each other columns
lets say I have this:
DataTable dt = new DataTable();
dt.Columns.Add("s1", typeof(string));
dt.Columns.Add("s2", typeof(string));
dt.Columns.Add("nt1", typeof(int));
dt.Columns.Add("nt2", typeof(int));
// Here we add five DataRows.
dt.Rows.Add("g1", "gg1", 1, 16);
dt.Rows.Add("g2", "gg1", 2, 15);
dt.Rows.Add("g1", "gg1", 3, 14);
dt.Rows.Add("g2", "gg1", 4, 13);
dt.Rows.Add("g1", "gg2", 5, 12);
dt.Rows.Add("g2", "gg2", 6, 11);
dt.Rows.Add("g1", "gg2", 7, 10);
dt.Rows.Add("g2", "gg2", 8, 9);
what I'm trying to get is :
g1 gg1 3 16
g1 gg2 7 12
g2 gg1 4 15
g2 gg2 8 11
this code not work :
dt = dt.AsEnumerable()
.GroupBy(r => new
{
s1 = r["s1"],
s2 = r["s2"]
})
.Select(x => x.Max())
.CopyToDataTable();
give me error :
Severity Code Description Project File Line Suppression State Error CS0311 The type 'System.Linq.IGrouping<string, string>' cannot be used as type parameter 'T' in the generic type or method 'DataTableExtensions.CopyToDataTable(IEnumerable)'. There is no implicit reference conversion from 'System.Linq.IGrouping<string, string>' to 'System.Data.DataRow'. testt C:\Users\TECNO\source\repos\testt\testt\Program.cs 44 Active
CodePudding user response:
So, the error happens on CopyToDataTable because of a type mismatch. You will need to convert the result of GroupBy into an IEnumerable of DataRow.
I did not work in LINQ for a very long while, you will need to apply a Select before you call CopyToDataTable and make sure that you select s1, s2, Max(nt1) and Max(nt2). Maybe you will also need to call ToList, I'm not sure, but you will definitely need to do another Select after the grouping.
CodePudding user response:
ok this code fix the problem
thanks all
var query = dt.AsEnumerable()
.GroupBy(x => new
{
s1 = x["s1"],
s2 = x["s2"]
})
.Select(grp => new {
s1 = grp.Key.s1,
s2 = grp.Key.s2,
nt1 = grp.Max(x => x["nt1"]),
nt2 = grp.Max(x => x["nt2"])
});
DataTable dt2 = dt.Clone();
dt2.Clear();
foreach (var item in query)
dt2.Rows.Add(item.s1, item.s2, item.nt1, item.nt2);
