Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsFree MagazinesWhite PapersSubmit Content
Discussion GroupsASP.NETWindows FormsLanguages.NET FrameworkVisual Studio.NET
Articles.NET FrameworkASP.NETToolsWindows Forms
.NET DirectoryOpen Source ProjectsUser GroupsWeb Resources
Related Topics
Visual Basic 6SQL ServerMS AccessOther DB ProductsMS Server ProductsMore Topics ...

.NET Forum / .NET Framework / General / March 2008

Tip: Looking for answers? Try searching our database.

LINQ - Concatenated seq from subcollection under parent collection

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
Todd Beaulieu - 04 Mar 2008 22:58 GMT
I suspect this is super simple, but I'm just getting started with linq.

I have a collection, say Orders. Under each Order I have a collection of
Lines.

I want to get a distinct list of ItemNumbers for all Orders.

Does anyone know how to do this? Is it a SelectMany()?

Thank you.
Jon Skeet [C# MVP] - 04 Mar 2008 23:29 GMT
> I suspect this is super simple, but I'm just getting started with linq.

I almost envy you, having the wonderful journey of discovery still
almost entirely ahead of you. (That's not to say I've stopped learning
about LINQ - far from it.)

> I have a collection, say Orders. Under each Order I have a collection of
> Lines.
>
> I want to get a distinct list of ItemNumbers for all Orders.
>
> Does anyone know how to do this? Is it a SelectMany()?

I'm assuming we have a situation like this:

public class Order
{
   public IEnumerable<Line> Lines { get; set; }
}

public class Line
{
   public int ItemNumber;
   public int Quantity { get; set; }
}

and you have an IEnumerable<Order> to examine.

You want to end up with an IEnumerable<int> which consists of all the
ItemNumbers of all the orders, but distinct. In other words, "all the
items we've sold *any* of". Is that about right?

The simplest way to do this is to use SelectMany(), as you've
suggested. That's usually more easily expressed in a query expression.
So, we'd have:

var allItems = from order in orders
              from line in order.Lines
              select line.ItemNumber;

var distinctItems = allItems.Distinct();

So, allItems effectively flattens the sequence of item numbers, and
then the second statement finds the distinct items. The query
expression boils down to this:

var allItems = orders.SelectMany (order => order.Lines,
                                 (order, line) => line.ItemNumber);

Does that help? Let me know if I've missed the boat, and I'll have
another go :)

Signature

Jon Skeet - <skeet@pobox.com>
http://www.pobox.com/~skeet   Blog: http://www.msmvps.com/jon.skeet
World class .NET training in the UK: http://iterativetraining.co.uk

Todd Beaulieu - 04 Mar 2008 23:46 GMT
Jon, you ROCK!

Thanks, bud. That was exactly what I needed.

It's funny about the "envying" bit. I *am* quite excited lately about all
these new wonderful technologies I'm learning.

After getting a simple, but nonetheless cool LINQ query going in my app, and
thus avoiding the usual enumeration mess, I actually looked for someone to
share the moment with. Sadly, nobody there would have cared. :(

I will certainly need to study your message some more so I can understand it.

Thanks again!

> > I suspect this is super simple, but I'm just getting started with linq.
>
[quoted text clipped - 47 lines]
> Does that help? Let me know if I've missed the boat, and I'll have
> another go :)
Jon Skeet [C# MVP] - 05 Mar 2008 00:09 GMT
> Jon, you ROCK!
>
> Thanks, bud. That was exactly what I needed.
>
> It's funny about the "envying" bit. I *am* quite excited lately about all
> these new wonderful technologies I'm learning.

I can't remember the last time I found a technology suite this
intoxicating. It's clearly useful, *and* fun to play with. It's easy to
come up with examples to write about, and they can be thoroughly
bizarre (check my blog for specimens).

> After getting a simple, but nonetheless cool LINQ query going in my app, and
> thus avoiding the usual enumeration mess, I actually looked for someone to
> share the moment with. Sadly, nobody there would have cared. :(

I remember the first time I used an iterator block - I showed a few
people, but I don't think any of them "got" quite how cool it was.

> I will certainly need to study your message some more so I can understand it.

Just let me know if I can help explain it further. This isn't a
selfless act - I want to learn how to express LINQ ideas as easily as
possible, hence Human LINQ and Visual LINQ. I think I've expressed the
C# side of LINQ reasonably clearly in my book, but that's no good for
newsgroup posts. (I refuse to turn *every* LINQ thread into a plug for
the book.)

Basically, if you find one particular part of a post difficult, it
could be for any or all of three reasons:

1) I've fouled up the explanation
2) It's a fundamentally tricky concept
3) You're not really reading what I've written

1 and 2 are more likely than 3, and 1 is often fixable.

Signature

Jon Skeet - <skeet@pobox.com>
http://www.pobox.com/~skeet   Blog: http://www.msmvps.com/jon.skeet
World class .NET training in the UK: http://iterativetraining.co.uk


Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.