Use LINQ to select distinct properties in Lists of Lists

I want to use LINQ to select a unique list of strings, stored as a List, inside an object. This object is itself stored in a List inside another object. It's hard to explain, here is an example:

public class Master
{
   public List<DataCollection> DateCollection { get; set; }
   public Master() { this.DateCollection = new List<DataCollection>(); }
}

public class DataCollection
{
   public List<Data> Data { get; set; }
   public DataCollection() { this.Data = new List<Data>(); }
}

public class Data
{
   public string Value{ get; set; }
   public Data() {  }
}

Using the Master class, I want to get a list of unique Value strings in the Data class. I have tried the following:

List<string> unique = master.Select(x => x.DataCollection.Select(y => y.Value)).Distinct().ToList();

Can somebody show me how it's done?

Upvotes: 15

Views: 11587

Answers (2)

Alex
Alex

Reputation: 13234

You can do that like this, directly using the public DateCollection member:

var unique = master.DateCollection
    .SelectMany(x => x.Data.Select(d => d.Value))
    .Distinct()
    .ToList();

The key being SelectMany to "flatten" the selection.

Upvotes: 31

Matthias Meid
Matthias Meid

Reputation: 12521

SelectMany projects a list of lists into a single list:

List<string> unique = master
    .SelectMany(x => x.DataCollection.Select(y => y.Value))
    .Distinct()
    .ToList();

Upvotes: 11

Related Questions