8

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.

Devmonster
  • 699
  • 1
  • 10
  • 28

2 Answers2

10

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();
Rich O'Kelly
  • 41,274
  • 9
  • 83
  • 114
  • Thank you! I have an object that is a property of a bigger object, that is in a list, that is in a list. Was able to get a unique list by doing `data.SelectMany(d => d.Refs).Select(r => r.MyObject).Distinct()` which is way simpler than using a `.ForEach()`. – jwatts1980 Feb 12 '14 at 18:15
3

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.

Community
  • 1
  • 1
mdm
  • 12,480
  • 5
  • 34
  • 53