Как создать новые столбцы из значений List <T>? - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть такой список:

internal class Order
{
    public Order()
    {
    }

    public string ProductID { get; set; }
    public int Amount { get; set; }
    public string Date { get; set; }
}

List<Order> orderList = new List<Order>() 
{
    new Order(){ ProductID="12345", Amount=300, Date = "2018-12-19"},
    new Order(){ ProductID="12345", Amount=0, Date = "2018-12-20"},
    new Order(){ ProductID="12345", Amount=200, Date = "2018-12-21"},
    new Order(){ ProductID="12345", Amount=250, Date = "2018-12-22"},
    new Order(){ ProductID="12345", Amount=30, Date = "2018-12-23"},
    new Order(){ ProductID="67898", Amount=20, Date = "2018-12-20"},
    new Order(){ ProductID="67898", Amount=30, Date = "2018-12-21"},
    new Order(){ ProductID="67898", Amount=40, Date = "2018-12-22"},
    new Order(){ ProductID="67898", Amount=50, Date = "2018-12-23"},
    new Order(){ ProductID="67898", Amount=130, Date = "2018-12-24"}
};

В этой ситуации, когда я преобразую список в DataTable и экспортирую его в Excel, я получаю следующее:

Current table

Я хочу создать новые столбцы из значений Дата и перечислить их по ProductID .Как я могу преобразовать этот список в DataTable, чтобы увидеть вот так:

enter image description here

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Вы хотите сводную таблицу, как в Excel.Код ниже создает две таблицы данных.Сначала один базовый, который вы перечислите.Затем возьмите первую таблицу и создайте вторую сводную таблицу

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication93
{
    class Program
    {
        static void Main(string[] args)
        {
            Order order = new Order();
            DataTable dt = order.MakeTable();

            //now create piviot table
            string[] dates = dt.AsEnumerable().Select(x => x.Field<string>("Date")).Distinct().ToArray();

            DataTable pivot = new DataTable();
            pivot.Columns.Add("ProductID", typeof(string));
            foreach (string date in dates)
            {
                pivot.Columns.Add(date, typeof(int));
            }

            var groups = dt.AsEnumerable().GroupBy(x => x.Field<string>("ProductID")).ToList();

            foreach(var group in groups)
            {
                DataRow newRow = pivot.Rows.Add();
                newRow["ProductID"] = group.Key;
                foreach (var col in group)
                {
                    newRow[col.Field<string>("Date")] = col.Field<int>("Amount");
                }

            }

        }
    }
    internal class Order
    {
        public Order()
        {
        }

        public string ProductID { get; set; }
        public int Amount { get; set; }
        public string Date { get; set; }

        public DataTable MakeTable()
        {
            DataTable dt = new DataTable();

            List<Order> orderList = new List<Order>() {
                new Order(){ ProductID="12345", Amount=300, Date = "2018-12-19"},
                new Order(){ ProductID="12345", Amount=0, Date = "2018-12-20"},
                new Order(){ ProductID="12345", Amount=200, Date = "2018-12-21"},
                new Order(){ ProductID="12345", Amount=250, Date = "2018-12-22"},
                new Order(){ ProductID="12345", Amount=30, Date = "2018-12-23"},
                new Order(){ ProductID="67898", Amount=20, Date = "2018-12-20"},
                new Order(){ ProductID="67898", Amount=30, Date = "2018-12-21"},
                new Order(){ ProductID="67898", Amount=40, Date = "2018-12-22"},
                new Order(){ ProductID="67898", Amount=50, Date = "2018-12-23"},
                new Order(){ ProductID="67898", Amount=130, Date = "2018-12-24"}
            };

            foreach (var prop in this.GetType().GetProperties())
            {
                string typeName = prop.PropertyType.FullName;
                Type systemType = System.Type.GetType(typeName);
                dt.Columns.Add(prop.Name, systemType);
            }
            foreach (Order row in orderList)
            {
                object[] data = row.GetType().GetProperties().Select(x => x.GetValue(row, null)).ToArray();
                dt.Rows.Add(data);
            }

            return dt;
        }
    }
}
0 голосов
/ 19 декабря 2018

Вы можете достичь этого, используя GroupBy и ExpandoObject:

var result = new List<ExpandoObject>();
foreach (var orders in orderList.GroupBy(obj => obj.ProductID))
{
    var record = new ExpandoObject();
    foreach (var order in orders.AsEnumerable())
    {
        ((IDictionary<string, object>)record).Add(order.Date, order.Amount);
    }
    result.Add(record);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...