C# Convertir lista <T>, tabla de datos y fila de objetos anónimos en columna

Convertir columnas en filas usando LINQ

 En este artículo haremos lo mismo, pero usando arrays y tablas de datos de C#, usando el poder de las expresiones LINQ o Lambda.

Colección de matrices C# o Listar<T> filas a columnas a DataTable

Aquí está el objeto C#

var datos = nuevo[] {

              nuevo { Producto = "Producto 1", Año = 2009, Ventas = 1212 },

              nuevo { Producto = "Producto 2", Año = 2009, Ventas = 522 },

              nuevo { Producto = "Producto 1", Año = 2010, Ventas = 1337 },

              nuevo { Producto = "Producto 2", Año = 2011, Ventas = 711 },

              nuevo { Producto = "Producto 2", Año = 2012, Ventas = 2245 },

              nuevo { Producto = "Producto 3", Año = 2012, Ventas = 1000 }

          };

var pivotTable1 = data.ToPivotTable(item => item.Year, item => item.Product, items => items.Any() ? items.Sum(x => x.Sales): 0);

jsonStr = JsonConvert.SerializeObject(tabla dinámica);


//Fila a columna

A continuación se muestra el método de extensión que definimos.

Tabla de datos estática pública ToPivotTable<T, TColumn, TRow, TData>(

    esta fuente IEnumerable<T>,

    Func<T, TColumn> columnSelector,

    Expresión<Func<T, TRow>>rowSelector,

    Func<IEnumerable<T>, TData> dataSelector)

        {

            Tabla de datos = nueva tabla de datos();

            var nombreDeFila = ((ExpresiónDeMiembro)SelectorDeFila.Cuerpo).Nombre.Miembro;

            table.Columns.Add(new DataColumn(rowName));

            var columnas = fuente.Select(columnSelector).Distinct();

  

            foreach (var columna en columnas)

                table.Columns.Add(new DataColumn(columna.ToString()));

  

            var filas = fuente.GroupBy(rowSelector.Compile())

                             .Select(grupo de filas => nuevo

                             {

                                 Clave = grupo de filas.Clave,

                                 Valores = columnas.GroupJoin(

                                     grupo de filas,

                                     c => c,

                                     r => selector de columna(r),

                                     (c, grupo de columnas) => selector de datos (grupo de columnas))

                             });

  

            foreach (var fila en filas)

            {

                var dataRow = tabla.NewRow();

                var elementos = fila.Values.Cast<objeto>().ToList();

                items.Insert(0, fila.Clave);

                dataRow.ItemArray = elementos.ToArray();

                tabla.Rows.Add(dataRow);

            }

  

            tabla de retorno;

        }

Puede crear una clase estática para el método de extensión y colocarla allí.
Para convertir valores de años en columnas y obtener una tabla dinámica:

C# Convertir filas de la colección List<T> en una colección de objetos anónimos

 Después de convertir las columnas en filas, es posible que desee obtener una Lista<dinámica> o dinámica[] en lugar de una Tabla de datos. Es muy conveniente en ASP. NET Web API devuelve una respuesta JSON.
Para hacer esto, actualicé el método de extensión para obtener el objeto dinámico. Utilice el siguiente método de extensión:
?

Lista estática pública<dinámica> ToPivotArray<T, TColumn, TRow, TData>(

esta fuente IEnumerable<T>,

Func<T, TColumn> columnSelector,

Expresión<Func<T, TRow>>rowSelector,

Func<IEnumerable<T>, TData> dataSelector)

       {

  

           var arr = nueva Lista<objeto>();

           var cols = nueva Lista<cadena>();

           String nombre de fila = ((MemberExpression)rowSelector.Body).Member.Name;

           var columnas = fuente.Select(columnSelector).Distinct();      

  

           cols =(new []{ rowName}).Concat(columns.Select(x=>x.ToString())).ToList();

   

           var filas = fuente.GroupBy(rowSelector.Compile())

                            .Select(grupo de filas => nuevo

                            {

                                Clave = grupo de filas.Clave,

                                Valores = columnas.GroupJoin(

                                    grupo de filas,

                                    c => c,

                                    r => selector de columna(r),

                                    (c, grupo de columnas) => selector de datos (grupo de columnas))

                            }).ToArray();

   

           foreach (var fila en filas)

           {

               var elementos = fila.Values.Cast<objeto>().ToList();

               items.Insert(0, fila.Clave);

               var obj = GetAnonymousObject(cols, items);

               arr.Agregar(obj);              

           }

           devolver arr.List();

       }

 privado estático dinámico GetAnonymousObject (columnas IEnumerable<cadena>, valores IEnumerable<objeto>)

       {

           IDictionary<cadena, objeto> eo = new ExpandoObject() as IDictionary<cadena, objeto>;

           ent yo;

           para (i = 0; i < columnas.Count(); i++)

           {

               eo.Add(columns.ElementAt<cadena>(i), valores.ElementAt<objeto>(i));

           }

           volver a él;

       }

ExpandoObject se utiliza para crear objetos dinámicos.

Ahora, para convertir filas en columnas y obtener una matriz dinámica

C# Convertir filas de tabla de datos a tabla de datos

Tengamos una tabla de datos con los mismos datos.

Tabla de datos miTabla de datos = nueva Tabla de datos();

myDataTable.Columns.AddRange(nueva columna de datos[3] { nueva columna de datos("Producto"), 

new DataColumn("Año", tipode(int)), new DataColumn("Ventas", tipode(int)) });

myDataTable.Rows.Add("Producto 1", 2009, 1212);

myDataTable.Rows.Add("Producto 2", 2009, 522);

myDataTable.Rows.Add("Producto 1", 2010, 1337);

myDataTable.Rows.Add("Producto 2", 2011, 711);

myDataTable.Rows.Add("Producto 2", 2012, 2245);

myDataTable.Rows.Add("Producto 3", 2012, 1000);

Puede utilizar el mismo método de extensión para obtener una tabla de datos de fila a columna como se muestra a continuación.

Tabla de datos a lista<dinámica>:

Si necesita convertir una tabla de datos en una lista de objetos dinámicos, utilice el siguiente método de extensión:

Lista estática pública <dinámica> ToDynamicList (este DataTable dt)

{

           var lista = nueva Lista<dinámica>();

           foreach (fila DataRow en dt.Rows)

           {

               dyn dinámico = nuevo ExpandoObject();

               lista.Add(dyn);

               foreach (columna DataColumn en dt.Columns)

               {

                   var dic = (IDictionario<cadena, objeto>)dyn;

                   dic[columna.NombreColumna] = fila[columna];

               }

           }

           lista de devolución;

}

Supongo que te gusta

Origin blog.csdn.net/qq_26695613/article/details/132558327
Recomendado
Clasificación