Сделать агрегацию данных

273
14 января 2018, 03:44

Здравствуйте! Пишу проект на ASP.NET MVC5.

Есть коллекция объектов, к примеру:

public class ProductState
{
    public int Name { get; set; }
    public int State { get; set; }
    public int Quantity { get; set; }
}

И я хочу вывести таблицу типа:

      | Name     | Name     | Name 
---------------------------------------
State | Quantity | Quantity | Quantity  
---------------------------------------
State | Quantity | Quantity | Quantity    
---------------------------------------   
State | Quantity | Quantity | Quantity    
--------------------------------------- 

Буду очень рад, если кто-нибудь подскажет, как это сделать.

Answer 1

Решение в лоб:

class Program
{
    public class ProductState
    {
        public int Name { get; set; }
        public int State { get; set; }
        public int Quantity { get; set; }
    }
    static void Main(string[] args)
    {
        var dataList = GetDataList();
        //Получаем все имена и статусы
        var names = dataList.Select(x => x.Name).Distinct().ToList();
        var states = dataList.Select(x => x.State).Distinct().ToList();
        //Далее генерирую HTML таблицу
        var stringBuilder = new StringBuilder();
        stringBuilder.AppendLine("<table bordercolor=\"black\" border=\"1\">");
        //Так как таблица формируется построчно, то первым делом выведем все имена (Причем первую добавляем пустой)
        stringBuilder.AppendLine("<tr>");
        AddCell(stringBuilder, string.Empty);
        foreach (var name in names)
        {
            AddCell(stringBuilder, name.ToString());
        }
        stringBuilder.AppendLine("</tr>");
        //После чего формируем каждую строку со значениями
        foreach (var state in states)
        {
            stringBuilder.AppendLine("<tr>");
            AddCell(stringBuilder, state.ToString());
            foreach (var name in names)
            {
                var item = dataList.First(x => x.State == state && x.Name == name);
                AddCell(stringBuilder, item.Quantity.ToString());
            }
            stringBuilder.AppendLine("</tr>");
        }
        stringBuilder.AppendLine("</table>");
        //Сохраняем и открываем документ
        File.WriteAllText("index.html", stringBuilder.ToString());
        Process.Start("index.html");
    }
    /// <summary>
    /// Добавление ячейки
    /// </summary>
    private static void AddCell(StringBuilder stringBuilder, string data)
    {
        stringBuilder.AppendLine($"<td width=\"100px\">{data}</td>");
    }
    /// <summary>
    /// Получение списка с данными
    /// </summary>
    private static List<ProductState> GetDataList()
    {
        return new List<ProductState>()
        {
            new ProductState(){Name = 1, State = 10, Quantity = 1},
            new ProductState(){Name = 1, State = 20, Quantity = 2},
            new ProductState(){Name = 1, State = 30, Quantity = 3},
            new ProductState(){Name = 2, State = 10, Quantity = 4},
            new ProductState(){Name = 2, State = 20, Quantity = 5},
            new ProductState(){Name = 2, State = 30, Quantity = 6},
            new ProductState(){Name = 3, State = 10, Quantity = 7},
            new ProductState(){Name = 3, State = 20, Quantity = 8},
            new ProductState(){Name = 3, State = 30, Quantity = 9},
        };
    }
}

P.S. Стринг билдер можно убрать, тут главное понять что таблица формируется построчно. Потому мы сначала достаем все уникальные значения имен и статусов. После чего проходим по всем статусом (Так как они являются строками). После чего проходим по всем уникальным именам и ищем соответствующее значение в общих данных, после чего соответственно их выводим.

READ ALSO
Запуск функции input

Запуск функции input

Здравствуйте, туплю сегодня по серьезному

239
Нормально ли задавать высоты тегам &lt;html&gt; и &lt;body&gt;?

Нормально ли задавать высоты тегам <html> и <body>?

Я ученикCтолкнулся с неадекватным поведением в адаптивного элемента (в Хроме в режиме имитации смартфона)

263
Не работает overflow-y:scroll

Не работает overflow-y:scroll

Имеется выпадающее меню, при ховере на вложенный пункт меню, если этих пунктов много и они выходят вниз за экран, должна появиться вертикальная...

315
Как удалить неиспользуемые стили из CSS?

Как удалить неиспользуемые стили из CSS?

Имеется HTML и CSS файл, в котором много неиспользуемых стилей CSS которые хотелось бы удалить в автоматическом режиме и оставить только те стили,...

444