Looking for c# Keywords? Try Ask4Keywords

C# Language 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 Query Синтаксис:

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 вместе с Id BlogPost связанным с этим комментарием. Для этого мы можем использовать соответствующую перегрузку 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"
}