Вложенный объект C # и конкатенация

#c# #linq #nested

#c# #linq #вложенный

Вопрос:

У меня есть список данных, как показано ниже

     OrderID= Order1 |ShipToName= Name1 |ItemNo= 11111 |Quantity= 10  
    OrderID= Order1 |ShipToName= Name1 |ItemNo= 22222 |Quantity= 6  
    OrderID= Order1 |ShipToName= Name1 |ItemNo= 33333 |Quantity= 20  
    OrderID= Order2 |ShipToName= Name2 |ItemNo= 12121 |Quantity= 2  
    OrderID= Order2 |ShipToName= Name2 |ItemNo= 22222 |Quantity= 5  
    OrderID= Order3 |ShipToName= Name3 |ItemNo= 33333 |Quantity= 3 
  

и это моя модель

     class FlatFileModel  
    {  
        FlatFileImports[] flatFileOrders;  
    }  
    class FlatFileImports  
    {  
            public string OrderID { get; set; }  
            public string ShipToName { get; set; }  
            public List<FlatFileImports> LineItems { get; set; }  
    }  
    class LineItems  
    {   
                public string ItemNo { get; set; }  
                public int Quantity { get; set; }  
    } 
  

То, что я хотел бы, чтобы он сделал, это консолидировал по номеру заказа в моем списке flatFileOrders, а затем вложил элементы в него.Что-то вроде этого.

 flatFileOrders(3)  
‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎Order1‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎   
‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎items(3)‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎   
‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎itemNo:11111    
‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎itemNo:22222    
‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎itemNo:33333    
‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎Order2‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎    
‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎items(2)‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎   
‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎itemNo:12121    
‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎itemNo:22222    
‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎Order3‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎  
‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎items(1)‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎  
‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎‏‏‎ ‎itemNo:33333 
  

Не очень повезло с поиском в Google этой ситуации, поскольку я не совсем уверен, как описать это, кроме консолидированного и вложенного? и я заранее приношу извинения за мое ужасное форматирование.

Комментарии:

1. Вы уверены, что эта строка public List<FlatFileImports> LineItems { get; set; } верна?

2. Короче говоря, вы пытаетесь создать вложенную структуру из плоских данных — противоположность тому, что предлагают имена классов. Сначала вам нужно загрузить данные в плоскую структуру, особенно если они хранятся в базе данных, так как SQL GROUP BY исключает подробные строки. С другой стороны, LINQ to Objects можно использовать GroupBy для сбора всех деталей, например, в Order и использовать дополнительные Select предложения для создания объектов из собранных деталей, например rows.GroupBy(r=>r.OrderId).Select(grp=>new {OrderID=grp.OrderID,Items=grp.Select(d=>new {d.ItemNo,d.Quantity{).ToArray());

3. @Pnagiotis Имя класса является частью того, над чем я работаю для данных, импортированных из файла Excel, а не SQL. Он представлен в виде списка по строкам. Однако я попытаюсь рассмотреть другие примеры вложенных структур stackoverflow из плоских данных. Спасибо.

4. @H.G.Sandhagen Я надеюсь на это. Я все еще новичок в c # и, возможно, я допускаю ошибку в своей модели, поэтому, пожалуйста, дайте мне знать, если есть более чистый способ сделать это.

5. Аналогично тому, что дал мне @PanagiotisKanavos, я использовал > var groupedCustomerList = output. GroupBy(u => u.OrderID) . Выберите(grp => new { groupId = grp.Key, CustomerList = grp. ToList() }) .ToList();

Ответ №1:

Проверьте, пожалуйста, ниже:

 var groupedCustomerList = flatModel.flatFileOrders
    .GroupBy(u => u.OrderID)
    .Select(pair => new
    {
        GroupID = pair.Key,
        Items = pair.Select(p => p.LineItems.Select(li => li.ItemNo))
    }).ToList();
  

Ответ №2:

Да, извините, я немного новичок в stackoverflow, но вот что дало мне нужные результаты.

 var ordersList = output.GroupBy(x => x.OrderId)
                       .Select(grp => new {OrderId = grp.Key, OrderDetail = grp.ToList()})
                        .ToList();