SelectMany Three Levels Deep

前端 未结 3 1723
甜味超标
甜味超标 2021-02-02 12:18

I can flatten the results of a child collection within a collection with SelectMany:

 // a list of Foos, a Foo contains a List of Bars
 var source = new List<         


        
相关标签:
3条回答
  • 2021-02-02 12:29

    Your query is returning all the widget IDs, instead of all the widgets. If you just want widgets, just use:

    var q = source.SelectMany(foo => foo.Bar)
                  .SelectMany(bar => bar.Widget)
                  .ToList();
    

    If that's still giving "the incorrect result" please explain in what way it's the incorrect result. Sample code would be very helpful :)

    EDIT: Okay, if you want the widget IDs, your original code should be fine:

    var q = source.SelectMany(foo => foo.Bar)
                  .SelectMany(bar => bar.Widget)
                  .Select(widget => widget.WidgetId)
                  .ToList();
    

    That could also be written as

    var q = (from foo in source
             from bar in foo.Bar
             from widget in bar.Widget
             select widgetId).ToList();
    

    if you like query expression format.

    This really should work - if it's not working, that suggests there's something wrong with your data.

    We should have checked before - is this just LINQ to Objects, or a fancier provider (e.g. LINQ to SQL)?

    0 讨论(0)
  • 2021-02-02 12:38
    var q = (
        from f in foo
        from b in f.Bars
        from w in b.Widgets
        select w.WidgetId
       ).ToList();
    

    Also note that if you want the unique list, you can do .Distinct().ToList() instead.

    0 讨论(0)
  • 2021-02-02 12:43
           var q = source.SelectMany(foo => foo.Bar)
              .SelectMany(bar => bar.Widget,(bar,widget) => widget.WidgetId)
              .ToList();
    

    we can call this overload of SelectMany() with allow us to specify the projection using lambda experession

    0 讨论(0)
提交回复
热议问题