Как сделать LINQ Select, GroupBy и Count из списка списков? - PullRequest
0 голосов
/ 31 августа 2018

у меня есть List<IEnumerable<Foo>>

Этот список выглядит следующим образом:

{
    [
      {a: 1, b: 2},
      {a: 1, b: 3}
    ],
    [{a: 1, b: 2}]
}

И мне нужно организовать это таким образом, группируя объекты по значениям a и b. Я не смог сделать групповой запрос к чему-либо подобному примеру ниже.

{
   {a: 1, b: 2, count: 2},
   {a: 1, b: 3, count: 1}
} 

Edit: Вот код, который у меня есть, и вывод:

var list = new List<object>();
foreach (var f in fooList)
{
    var x = from y in f
            group y by new { y.a, y.b } into z
            select new
            {
                Foo = z.Key,
                Count = z.Count()
            };
    a.Add(x);
}

Выход:

[
  {
     "Foo": {
         "a": 1,
         "b": 2
     },
     "count": 1
  },
  {
     "Foo": {
         "a": 1,
         "b": 2
     },
     "count": 1
  },
  {
     "Foo": {
         "a": 1,
         "b": 3
     },
     "count": 1
  }
],

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Вы должны сгладить свой первый список, так как вложенный уровень не имеет отношения к желаемому результату. Это показывает, как сгладить. Я думаю, что ваша группа верна.

    List<List<Foo>> list = new List<List<Foo>>();
    list.Add(new List<Foo>());
    list[0].Add(new Foo { a = 1, b = 2 });
    list[0].Add(new Foo { a = 1, b = 3 });
    var subList = new List<Foo>();
    subList.Add(new Foo { a = 1, b = 2 });
    list.Add(subList);
    var flat = list.SelectMany(i => i);
    var grouped = from foo in flat group foo by new { foo.a, foo.b } into g select g;
    Assert.AreEqual(true, grouped.First().Count() == 2);
    Assert.AreEqual(true, grouped.Last().Count() == 1);
0 голосов
/ 31 августа 2018

Примерно так будет работать:

var list = new List<List<Foo>>();
list.Add(new List<Foo> {new Foo {A = 1, B = 2}, new Foo {A = 1, B = 3}});
list.Add(new List<Foo> {new Foo {A = 1, B = 2}});

var result = list.SelectMany(l => l)
    .GroupBy(l => new {l.A, l.B})
    .Select(grp => new {A = grp.Key.A, B = grp.Key.B, Count = grp.Count()});

Сначала список выравнивается с помощью SelectMany(). После этого мы GroupBy несколько значений с помощью анонимного объекта. После группировки мы выбираем начальные значения и количество групп в анонимный объект.


Кажется, вы хотите, чтобы ваш результат был сериализован. Используя Json.Net , это будет вывод:

[
   {
      "A":1,
      "B":2,
      "Count":2
   },
   {
      "A":1,
      "B":3,
      "Count":1
   }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...