c# - ejemplos - Grupo de DataTable el resultado
leer datatable c# (2)
Quiero agrupar en Datatable por nombre, apellido y el resto debería estar en la misma fila. ¿Alguien puede ayudarme con eso?
Mi DataTable:
Name LastName 1 3 2
kiki ha FF
lola mi AA
ka xe UU
kiki ha SS
Quiero tener el grupo DataTable por nombre:
Name LastName 1 3 2
kiki ha FF SS
lola mi AA
ka xe UU
Mi nuevo código:
var result11 = from t1 in newtable.AsEnumerable()
group t1 by new { Name = t1.Field<String>("Name"), LastName = t1.Field<String>("LastName") } into grp
select new
{
Name = grp.Key.Name,
LastName = grp.Key.LastName,
//Something must be there
};
Agregue estas líneas en lugar del comentario ( //something must be there
):
C1 = String.Join(",", grp.Select(r=>r.Field<String>("1"))),
C2 = String.Join(",", grp.Select(r=>r.Field<String>("2"))),
C3 = String.Join(",", grp.Select(r=>r.Field<String>("3")))
para obtener tres nuevas columnas en la salida que agregan valores de las columnas 1
, 3
y 2
.
Si tiene varios valores en una de las columnas de un grupo, todos los valores se mostrarán y separarán por comas ( ,
).
Si está seguro de que hay como máximo un valor por columna por grupo, puede hacer lo siguiente:
C1 = grp.Max(r => r.Field<String>("1")),
C3 = grp.Max(r => r.Field<String>("3")),
C2 = grp.Max(r => r.Field<String>("2"))
Si desea una DataTable
como resultado, esto le dará el resultado deseado:
var lastNameGroups = from row in table1.AsEnumerable()
group row by new {
Name= row.Field<String>("Name"),
LastName = row.Field<String>("LastName")
} into LastNameGroups
select LastNameGroups;
var table2 = table1.Clone();
foreach (var lng in lastNameGroups)
{
var row = table2.Rows.Add();
row.SetField("Name", lng.Key.Name);
row.SetField("LastName", lng.Key.LastName);
var ones = lng.Where(r => !string.IsNullOrEmpty(r.Field<String>("1")));
if(ones.Any())
row.SetField("1", ones.First().Field<String>("1"));
var twos = lng.Where(r => !string.IsNullOrEmpty(r.Field<String>("2")));
if (twos.Any())
row.SetField("2", twos.First().Field<String>("2"));
var threes = lng.Where(r => !string.IsNullOrEmpty(r.Field<String>("3")));
if (threes.Any())
row.SetField("3", threes.First().Field<String>("3"));
}