我有一个这样的课程:
public class MailMessage
{
public string From {get; set; };
public string To {get; set; };
public ICollection<Attachment> Attachments { get; set; }
}
public class Attachment
{
public string Name {get; set;}
public byte[] Content {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我想获取附件集合中名称以 .pdf 结尾的所有附件。
我尝试了以下方法:
List<MailMessage> list = new List<MailMessage>();
List<attachment> pdfAttachmentsCollection = list.Where(x => x.Attachments
.Where(attachment =>
attachment.Name.EndsWith(".pdf")).Select(y => y.Content));
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用。有什么建议。它给出了错误:
无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“bool”
几个问题:
SelectMany从MailMessage对象中获取单个集合中的所有附件y.Content哪个是byte[]但试图获取列表Attachment重写后,您可能想要执行以下操作:
List<MailMessage> list = new List<MailMessage>();
IEnumerable<Attachment> pdfAttachmentsCollection =
list.SelectMany(message =>
message.Attachments
.Where(attachment => attachment.Name.EndsWith(".pdf")));
Run Code Online (Sandbox Code Playgroud)
这也是编写为查询表达式的好选择:
IEnumerable<Attachment> pdfAttachmentsCollection =
from message in list
from attachment in message.Attachments
where attachment.Name.EndsWith(".pdf")
select attachment;
Run Code Online (Sandbox Code Playgroud)
这两者都做同样的事情,只是语法不同。
如果您希望将此作为 aList<Attachment>您也可以.ToList()在任一查询的末尾执行。作为一个 IEnumerable,它不会被评估,直到你开始迭代它(并且取决于你如何使用它,你可能永远不会在内存中拥有完整的集合)。但是,如果您对其进行多次迭代或操作,则会导致对其进行多次评估——因此在这些情况下.ToList()肯定是有道理的。