Используйте LINQ для выбора отдельных свойств в списках списков

Я хочу использовать LINQ для выбора уникального списка строк, хранящихся в виде списка, внутри объекта. Этот объект сам хранится в списке внутри другого объекта. Трудно объяснить, вот пример:

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() {  }
}

Используя мастер-класс, я хочу получить список уникальных строк значений в классе Data. Я пробовал следующее:

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

Может кто-нибудь показать мне, как это сделано?

Ответ 1

Вы можете сделать это, как это, напрямую используя общедоступный член DateCollection:

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

Ключ SelectMany для "сглаживания" выбора.

Ответ 2

SelectMany проецирует список списков в один список:

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