Используйте 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();