Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 896
John 'Mark' Smith Avatar asked Apr 16 '15 15:04

John 'Mark' Smith


2 Answers

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.

like image 76
Alex Avatar answered Oct 13 '22 23:10

Alex


SelectMany projects a list of lists into a single list:

List<string> unique = master
    .SelectMany(x => x.DataCollection.Select(y => y.Value))
    .Distinct()
    .ToList();
like image 41
Matthias Meid Avatar answered Oct 14 '22 00:10

Matthias Meid