SelectMany 展平一系列序列
var sequenceOfSequences = new [] { new [] { 1, 2, 3 }, new [] { 4, 5 }, new [] { 6 } };
var sequence = sequenceOfSequences.SelectMany(x => x);
// returns { 1, 2, 3, 4, 5, 6 }
如果有,請使用 SelectMany()
,或者你正在建立序列序列,但是你希望將結果作為一個長序列。
在 LINQ 查詢語法中:
var sequence = from subSequence in sequenceOfSequences
from item in subSequence
select item;
如果你有一個集合集合,並希望能夠同時處理來自父集合和子集合的資料,那麼也可以使用 SelectMany
。
我們來定義簡單的類
public class BlogPost
{
public int Id { get; set; }
public string Content { get; set; }
public List<Comment> Comments { get; set; }
}
public class Comment
{
public int Id { get; set; }
public string Content { get; set; }
}
我們假設我們有以下收集。
List<BlogPost> posts = new List<BlogPost>()
{
new BlogPost()
{
Id = 1,
Comments = new List<Comment>()
{
new Comment()
{
Id = 1,
Content = "It's really great!",
},
new Comment()
{
Id = 2,
Content = "Cool post!"
}
}
},
new BlogPost()
{
Id = 2,
Comments = new List<Comment>()
{
new Comment()
{
Id = 3,
Content = "I don't think you're right",
},
new Comment()
{
Id = 4,
Content = "This post is a complete nonsense"
}
}
}
};
現在我們要選擇評論 Content
以及與此評論相關的 BlogPost
的 Id
。為了做到這一點,我們可以使用適當的 SelectMany
過載。
var commentsWithIds = posts.SelectMany(p => p.Comments, (post, comment) => new { PostId = post.Id, CommentContent = comment.Content });
我們的 commentsWithIds
看起來像這樣
{
PostId = 1,
CommentContent = "It's really great!"
},
{
PostId = 1,
CommentContent = "Cool post!"
},
{
PostId = 2,
CommentContent = "I don't think you're right"
},
{
PostId = 2,
CommentContent = "This post is a complete nonsense"
}