LINQ - Concatenated seq from subcollection under parent collection

T

Todd Beaulieu

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.
 
J

Jon Skeet [C# MVP]

Todd Beaulieu said:
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 :)
 
T

Todd Beaulieu

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!
 
J

Jon Skeet [C# MVP]

Todd Beaulieu said:
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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top