У меня есть класс с именем 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»
Отредактировано добавление сообщения об ошибке
Обновление за комментарий: поскольку вам нужен один элемент, вам действительно не нужен 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();
Не работает. Мне нужно отправить простого Получателя сюда. Не список тех
@HudsonMedeiros Этот комментарий немного сбивает с толку, поскольку в вопросе у вас есть пример кода, который создает список получателей и называется «(ПРАВИЛЬНО РАБОТАЕТ)», а исходный код в этом ответе делал то же самое, за исключением использования linq, который к чему был задан вопрос.
@RufusL еще больше сбивает с толку то, как принятый ответ работал для OP, а мой - нет ..
Да, они были идентичными, за исключением того, что вы добавили .ToList()
, что они и просили.
Вы слишком много работаете! .Select
возвращает нужный список. Оборачивать этот список в конструктор Recipient
не требуется.
var recipientListWithLINQ =
message.Copies.Select(item => new Recipient {
EmailAddress = new EmailAddress {
Address = item
}
});
Он работал именно так, как мне было нужно. Спасибо за объяснение @catfood. Вы спасли мой день!
обратите внимание, что если вам нужен список, вам нужно добавить .ToList()
в конце
На самом деле проблема в том, что вы не использовали правильный конструктор для списка
// 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();
что именно означает "не работает"? Мы не видим вашу ошибку...