如何从列表列表中进行 LINQ Select、GroupBy 和 Count?

我有一个 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}

编辑:这是我拥有的代码和输出:


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

  }

],


绝地无双
浏览 252回答 2
2回答

慕桂英4014372

像这样的事情会起作用: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)&nbsp; &nbsp; .GroupBy(l => new {l.A, l.B})&nbsp; &nbsp; .Select(grp => new {A = grp.Key.A, B = grp.Key.B, Count = grp.Count()});首先列表被扁平化SelectMany()。之后,我们GroupBy通过使用匿名对象多个值。分组后,我们选择初始值和分组中的计数到一个匿名对象中。您似乎希望将结果序列化。使用Json.Net,这将是输出:[&nbsp; &nbsp;{&nbsp; &nbsp; &nbsp; "A":1,&nbsp; &nbsp; &nbsp; "B":2,&nbsp; &nbsp; &nbsp; "Count":2&nbsp; &nbsp;},&nbsp; &nbsp;{&nbsp; &nbsp; &nbsp; "A":1,&nbsp; &nbsp; &nbsp; "B":3,&nbsp; &nbsp; &nbsp; "Count":1&nbsp; &nbsp;}]

当年话下

您必须展平您的第一个列表,因为嵌套级别与您想要的结果无关。这显示了如何展平。我认为您的 GroupBy 是正确的。&nbsp; &nbsp; List<List<Foo>> list = new List<List<Foo>>();&nbsp; &nbsp; list.Add(new List<Foo>());&nbsp; &nbsp; list[0].Add(new Foo { a = 1, b = 2 });&nbsp; &nbsp; list[0].Add(new Foo { a = 1, b = 3 });&nbsp; &nbsp; var subList = new List<Foo>();&nbsp; &nbsp; subList.Add(new Foo { a = 1, b = 2 });&nbsp; &nbsp; list.Add(subList);&nbsp; &nbsp; var flat = list.SelectMany(i => i);&nbsp; &nbsp; var grouped = from foo in flat group foo by new { foo.a, foo.b } into g select g;&nbsp; &nbsp; Assert.AreEqual(true, grouped.First().Count() == 2);&nbsp; &nbsp; Assert.AreEqual(true, grouped.Last().Count() == 1);
打开App,查看更多内容
随时随地看视频慕课网APP