Presuming that the class overrides Equals
+ GetHashCode
or you have a custom IEqualityComparer<SomeObject>
you can use following query which uses Enumerable.All
:
var result = list
.SelectMany(t => t.Item2) // select all objects
.Distinct() // just an optimization since duplicates are guaranteed
.Where(obj => list.All(t => t.Item2.Contains(obj)));
Here's my sample data:
var list = new List<Tuple<string, List<SomeObject>>>();
list.Add(Tuple.Create("a", new List<SomeObject> { new SomeObject { ID = 1 }, new SomeObject { ID = 2 }, new SomeObject { ID = 4 } }));
list.Add(Tuple.Create("b", new List<SomeObject> { new SomeObject { ID = 1 }, new SomeObject { ID = 2 }, new SomeObject { ID = 3 } }));
list.Add(Tuple.Create("c", new List<SomeObject> { new SomeObject { ID = 1 }, new SomeObject { ID = 2 }, new SomeObject { ID = 3 } }));
list.Add(Tuple.Create("d", new List<SomeObject> { new SomeObject { ID = 1 }, new SomeObject { ID = 2 }, new SomeObject { ID = 3 } }));
Only the SomeObjects
with ID = 1 or ID = 2 are in all lists and that's the result of the query.