LINQ - свести список объектов с дочерним списком в один список - PullRequest
0 голосов
/ 18 марта 2020

У меня есть класс Activity, и у этого класса есть дочерний список Users. Вот как это выглядит:

public class Activity
{
    public Activity()
    {
    }

    public string Number { get; set; }
    public virtual ICollection<User> Users { get; set; }        
}

Класс пользователя выглядит следующим образом:

public class User
{
    public User()
    {
    }

    public string Name { get; set; }        
}

Используя LINQ, я хотел бы создать "List<KeyValuePair<string,User>>()". Так, например, если бы у меня был набор данных, который выглядел так:

var activities = new List<Activity>()
{
    new Activity()
    {
        Number = "ActivityA",
        Users = new List<User>()
        {
            new User()
            {
                Name = "UserA"
            },
            new User()
            {
                Name = "UserB"
            },
            new User()
            {
                Name = "UserC"
            }
        }
    },
    new Activity()
    {
        Number = "ActivityB",
        Users = new List<User>()
        {
            new User()
            {
                Name = "UserD"
            },
            new User()
            {
                Name = "UserE"
            },
            new User()
            {
                Name = "UserF"
            }
        }
    }
};

Какой оператор LINQ мне нужно написать, чтобы мой выходной список KeyValuePair выглядел так:

enter image description here

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Вы можете использовать SelectManay, чтобы сгладить список списка из KeyValuePair<string, string> в один список , например, следующий код:

List<KeyValuePair<string, string>> keyValuePairs = activities
    .SelectMany(x => x.Users.Select(y => new KeyValuePair<string, string>(x.Number, y.Name)))
    .ToList();

Если вы для списка KeyValuePair<string, User> используйте следующий код:

List<KeyValuePair<string, User>> keyValuePairs = activities
    .SelectMany(x => x.Users.Select(y => new KeyValuePair<string, User>(x.Number, y)))
    .ToList();

Обратите внимание, что Number действий считается уникальными.

Number и Name должны быть string.

Я надеюсь, это поможет вам.

0 голосов
/ 18 марта 2020

Используйте LINQ Выберите и SelectMany , чтобы преобразовать объекты в новую форму.

Отредактировано в соответствии с модификацией OP.

var results = activities.SelectMany(activity => activity.Users.Select(user => new KeyValuePair<string, string>(activity.Number, user.Name))).ToList();

Хотя класс имеет Name и Number как int, но данные определяются как строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...