Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

LINQ Getting Unique items from a List within a List

I have a List of type MyObject with a definition below:

class MyObject {
     public string ListName { get; set; }
     public IEnumerable<OtherObject> ObjectList { get; set;}
}

Given a List of type MyObject, using LINQ what expression should I use to get all distinct OtherObject?

What I was planning to do was loop each MyObject and get the distinct OtherObject from the ObjectList property, but then I need to get the distinct across the list.

Please note that if: MyObject[0].Objectlist[0] == 'ItemA' and MyObject[1].Objectlist[0] == 'ItemA' it will still return a single instance of ItemA. This code is just a representation only. This is not how I access my objects, by the way.

like image 512
Devmonster Avatar asked Jul 12 '12 08:07

Devmonster


2 Answers

You can achieve this simply using Set logic. C# has a nice implementation in the form of HashSet:

var set = new HashSet<OtherObject>(myObjects.SelectMany(mo => mo.ObjectList));

Or if you prefer deferred execution, you can use the LINQ Distinct method:

var distinct = myObjects.SelectMany(mo => mo.ObjectList).Distinct();
like image 99
Rich O'Kelly Avatar answered Sep 19 '22 18:09

Rich O'Kelly


How about:

var l = new List<MyObject>(...);
var unique = l.SelectMany(j => j.ObjectList).Distinct();

You can use the technique from Distinct() with lambda? to alter how you decide if an object is distinct from another.

like image 22
mdm Avatar answered Sep 20 '22 18:09

mdm