C# 用列表 属性 展平对象列表
C# flatten a list of objects with a list property
给定以下对象:
public class Person
{
public string Name {get; set;}
public string Age {get; set;}
public list<string> Interests {get; set;}
}
是否有一种很好的单行 linq 方法来展平它(我对扩展方法持开放态度),例如,如果我们有
var People = new List<Person>(){
new Person(){
Name = "Bill",
Age = 40,
Interests = new List<string>(){"Football", "Reading"}
},
new Person = new List<Person>(){
Name = "John",
Age = 32,
Interests = new List<string>(){ "Gameshows", "Reading"}
},
new Person = new List<Person>(){
Name = "Bill",
Age = 40,
Interests = new List<string>(){ "Golf"}
}
}
我们可以得到一个结果(即如果其他属性匹配,AddRange 到 Interests
列表 属性):
{
{
Name = "Bill",
Age = 40,
Interests = {"Football", "Reading", "Golf"}
},
{
Name = "John",
Age = 32,
Interests = { "Gameshows", "Reading"}
}
}
我们可以尝试 GroupBy
和 SelectMany
:
List<Person> People = ...
var result = People
.GroupBy(person => new {
person.Name,
person.Age
})
.Select(chunk => new Person() {
Name = chunk.Key.Name,
Age = chunk.Key.Age,
Interests = chunk
.SelectMany(item => item.Interests)
.Distinct()
.ToList()
})
.ToList(); // if we want List<People>
您可以使用GroupBy
和SelectMany
来串联兴趣
People.GroupBy(c => new
{
c.Name,
c.Age
})
.Select(g => new Person()
{ Name = g.Key.Name,
Age = g.Key.Age,
Interests = g.SelectMany(r => r. Interests).ToList()})
给定以下对象:
public class Person
{
public string Name {get; set;}
public string Age {get; set;}
public list<string> Interests {get; set;}
}
是否有一种很好的单行 linq 方法来展平它(我对扩展方法持开放态度),例如,如果我们有
var People = new List<Person>(){
new Person(){
Name = "Bill",
Age = 40,
Interests = new List<string>(){"Football", "Reading"}
},
new Person = new List<Person>(){
Name = "John",
Age = 32,
Interests = new List<string>(){ "Gameshows", "Reading"}
},
new Person = new List<Person>(){
Name = "Bill",
Age = 40,
Interests = new List<string>(){ "Golf"}
}
}
我们可以得到一个结果(即如果其他属性匹配,AddRange 到 Interests
列表 属性):
{
{
Name = "Bill",
Age = 40,
Interests = {"Football", "Reading", "Golf"}
},
{
Name = "John",
Age = 32,
Interests = { "Gameshows", "Reading"}
}
}
我们可以尝试 GroupBy
和 SelectMany
:
List<Person> People = ...
var result = People
.GroupBy(person => new {
person.Name,
person.Age
})
.Select(chunk => new Person() {
Name = chunk.Key.Name,
Age = chunk.Key.Age,
Interests = chunk
.SelectMany(item => item.Interests)
.Distinct()
.ToList()
})
.ToList(); // if we want List<People>
您可以使用GroupBy
和SelectMany
来串联兴趣
People.GroupBy(c => new
{
c.Name,
c.Age
})
.Select(g => new Person()
{ Name = g.Key.Name,
Age = g.Key.Age,
Interests = g.SelectMany(r => r. Interests).ToList()})