簡體   English   中英

Linq Group by Complex Object(對象的EG列表元素)

[英]Linq Group by Complex Object (E.G list element of object)

我有一個如下所示的 object;

var json = @"{
  'TableNumber': '3',
  'TableId': '81872d39-9480-4d2d-abfc-b8e4f33a43b6',
  'tableMenuItems': [
    {
      'Id': '4664a2d3-c0af-443d-8af5-2bd21e71838b',
      'Name': 'Bonfile',
      'tableMenuItemCondiment': [
        {
          'Id': '9b1f01a0-0313-46b6-b7f1-003c0e846136',
          'Name': 'Kekikkli',
          'Price': 0
        },
        {
          'Id': '38a9cce6-f20c-4f78-b6c9-c15e79ecc8f1',
          'Name': 'mayonez',
          'Price': 0
        },
        {
          'Id': 'cb3a7811-668b-4e45-bce3-e6b2b13af9e1',
          'Name': 'Rare',
          'Price': 0
        }
      ],
      'Price': 45,
      'Count': 1
    },
    {
      'Id': '4664a2d3-c0af-443d-8af5-2bd21e71838b',
      'Name': 'Bonfile',
      'tableMenuItemCondiment': [
        {
          'Id': 'c3c62f7d-987d-4523-849c-932334db4e4f',
          'Name': 'Kekikkli',
          'Price': 0
        },
        {
          'Id': 'cbb16028-6e77-4e4b-a1c9-d969e804f093',
          'Name': 'mayonez',
          'Price': 0
        },
        {
          'Id': '16f9efc2-73d3-4a09-87fc-e1fb76957ed2',
          'Name': 'Rare',
          'Price': 0
        }
      ],
      'Price': 45,
      'Count': 1
    }
  ],
  'TotalPrice': 90
}";

正如您在上面看到的,object 具有作為 tableMenuItems 的列表元素。 tableMenuItems 屬性中有兩個 object,這是完全相同的。 我想像下面這樣對這個 object 進行分組;

var json = @"{
  'TableNumber': '3',
  'TableId': '81872d39-9480-4d2d-abfc-b8e4f33a43b6',
  'tableMenuItems': [
    {
      'Id': '4664a2d3-c0af-443d-8af5-2bd21e71838b',
      'Name': 'Bonfile',
      'tableMenuItemCondiment': [
        {
          'Id': '9b1f01a0-0313-46b6-b7f1-003c0e846136',
          'Name': 'Kekikkli',
          'Price': 0
        },
        {
          'Id': '38a9cce6-f20c-4f78-b6c9-c15e79ecc8f1',
          'Name': 'mayonez',
          'Price': 0
        },
        {
          'Id': 'cb3a7811-668b-4e45-bce3-e6b2b13af9e1',
          'Name': 'Rare',
          'Price': 0
        }
      ],
      'Price': 90,
      'Count': 2
    }    
  ],
  'TotalPrice': 90
}";

如您所見,如果兩個 tablemenuitems 相同並且它們的調味品相同我將它們分組。 我為 gruping 制作了一些 IEqualityComparer,但它不起作用,我除外。

這是我在下面的鏈接中看到的;

https://do.netfiddle.net/QQFfIy

我不明白我做錯了什么

1 ) 我創建了我的課程以滿足 json,

public class MyTable {
    public string TableNumber { get; set; }
    public string TableId { get; set; }
    public List<TableMenu> tableMenuItems { get; set; }
    public int TotalPrice { get; set; }
}

public class TableMenu {
    public string Id { get; set; }
    public string Name { get; set; }
    public List<TableMenuItemCondiment> tableMenuItemCondiment { get; set; }
    public int Price { get; set; }
    public int Count { get; set; }
}

public class TableMenuItemCondiment {
    public string Id { get; set; }
    public string Name { get; set; }
    public int Price { get; set; }
}

2)然后我通過NewtonSoft反序列化了object,

MyTable myTable = JsonConvert.DeserializeObject<MyTable>(json);

3)轉換為object,

MyTable result = new MyTable() {
                TableNumber = myTable.TableNumber,
                TableId = myTable.TableId,
                tableMenuItems = myTable.tableMenuItems.GroupBy(x => x.Id).Select(x => new TableMenu() {
                    Id = x.Key,
                    Name = x.First()?.Name,
                    tableMenuItemCondiment = x.SelectMany(a=>a.tableMenuItemCondiment).GroupBy(z => z.Name).Select(z => new TableMenuItemCondiment() {
                        Id = z.First()?.Id,
                        Name = z.Key,
                        Price = z.Sum(t => t.Price)
                    }).ToList(),
                    Price = x.Sum(t => t.Price),
                    Count = x.Sum(t => t.Count)
                }).ToList(),
                TotalPrice = myTable.TotalPrice
            };

4 ) 最后序列化object,看是否如你所願給出響應,

string output = JsonConvert.SerializeObject(result);

5)打印output,

Console.WriteLine(output);
Console.ReadKey();

Output:

{  "TableNumber":"3", 
  "TableId":"81872d39-9480-4d2d-abfc-b8e4f33a43b6", 
  "tableMenuItems":[
     {
        "Id":"4664a2d3-c0af-443d-8af5-2bd21e71838b",
        "Name":"Bonfile",
        "tableMenuItemCondiment":[
           {
              "Id":"9b1f01a0-0313-46b6-b7f1-003c0e846136",
              "Name":"Kekikkli",
              "Price":0
           },
           {
              "Id":"38a9cce6-f20c-4f78-b6c9-c15e79ecc8f1",
              "Name":"mayonez",
              "Price":0
           },
           {
              "Id":"cb3a7811-668b-4e45-bce3-e6b2b13af9e1",
              "Name":"Rare",
              "Price":0
           }
        ],
        "Price":90,
        "Count":2
     }    
],    
"TotalPrice":90 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM