Создайте список с помощью LINQ

У меня есть класс с именем message, внутри которого у меня есть IEnumerable с именем copies.

Мне нужно создать новый объект класса Recipient с копиями content.

Для этого я создал список Recipient, а затем взаимодействовал с copies с помощью метода ForEach; Но я взял так много строк кода, и мне это не нравится. Есть ли способ сделать это с помощью LINQ методов?

Я положу ниже, что я сделал до сих пор.

КОД С ИСПОЛЬЗОВАНИЕМ FOREACH (ПРАВИЛЬНО РАБОТАЕТ)

var recipientListWithForEach = new List<Recipient>();

foreach (var item in message.Copies)
{
    recipientListWithForEach.Add(new Recipient
    {
        EmailAddress = new EmailAddress
        {
            Address = item
        }
    });
}

КОД С ИСПОЛЬЗОВАНИЕМ LINQ (НЕ РАБОТАЕТ, ИДК ПОЧЕМУ)

var recipientListWithLINQ = new List<Recipient> {
    message.Copies.Select(item => new Recipient {
        EmailAddress = new EmailAddress {
            Address = item
        }
    });
};

Предоставление сообщения об ошибке:

невозможно преобразовать из «System.Collections.Generic.IEnumerable<Microsoft.Graph.Recipient>» в «Microsoft.Graph.Recipient»

что именно означает "не работает"? Мы не видим вашу ошибку...

MakePeaceGreatAgain 10.12.2020 21:51

Отредактировано добавление сообщения об ошибке

Hudson Medeiros 10.12.2020 21:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
105
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Обновление за комментарий: поскольку вам нужен один элемент, вам действительно не нужен IEnumerable. Просто выберите первый элемент из Copies и создайте свой Recipient. И, возможно, выбрать лучшее имя для переменной?

var item = message.Copies.First();
var recipientListWithLINQ = new Recipient {
    EmailAddress = new EmailAddress {
        Address = item
    }
};

Оригинальный ответ:

Вам нужно преобразовать IEnumerable в список с помощью ToList()

var recipientListWithLINQ = message.Copies.Select(item => new Recipient {
    EmailAddress = new EmailAddress {
        Address = item
    }
}).ToList();

Не работает. Мне нужно отправить простого Получателя сюда. Не список тех

Hudson Medeiros 10.12.2020 21:57

@HudsonMedeiros Этот комментарий немного сбивает с толку, поскольку в вопросе у вас есть пример кода, который создает список получателей и называется «(ПРАВИЛЬНО РАБОТАЕТ)», а исходный код в этом ответе делал то же самое, за исключением использования linq, который к чему был задан вопрос.

Rufus L 10.12.2020 22:04

@RufusL еще больше сбивает с толку то, как принятый ответ работал для OP, а мой - нет ..

Yehor Androsov 10.12.2020 22:09

Да, они были идентичными, за исключением того, что вы добавили .ToList(), что они и просили.

Rufus L 10.12.2020 22:11
Ответ принят как подходящий

Вы слишком много работаете! .Select возвращает нужный список. Оборачивать этот список в конструктор Recipient не требуется.

var recipientListWithLINQ =
    message.Copies.Select(item => new Recipient {
        EmailAddress = new EmailAddress {
            Address = item
        }
    });

Он работал именно так, как мне было нужно. Спасибо за объяснение @catfood. Вы спасли мой день!

Hudson Medeiros 10.12.2020 22:07

обратите внимание, что если вам нужен список, вам нужно добавить .ToList() в конце

Rufus L 10.12.2020 22:10

На самом деле проблема в том, что вы не использовали правильный конструктор для списка

// working
new List<T>(items)

Ниже приведен синтаксис инициализации списка, который принимает не IEnumerable, а отдельные элементы, разделенные запятой.

// bad
new List<T> {items}
// working
new List<T> {item1, item2}

Итак, просто исправьте свой код

var recipientListWithLINQ = new List<Recipient> (
    message.Copies.Select(item => new Recipient {
        EmailAddress = new EmailAddress {
            Address = item
        }
    ));
};

Но запрос LINQ должен быть проще

var recipientListWithLINQ = 
    message.Copies.Select(item => new Recipient {
        EmailAddress = new EmailAddress {
            Address = item
        }
    )
    .ToList();

Другие вопросы по теме