我有一个这样的班级:
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;}
}
我想获取附件集合中所有名称以.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));
但是,这不起作用。有什么建议么。它给出了错误:
无法隐式转换类型 'System.Collections.Generic.IEnumerable'到'bool'
答案 0 :(得分:4)
几个问题:
SelectMany
对象中的MailMessage
才能在单个集合中获取所有附件y.Content
的{{1}},但尝试获取byte[]
的列表重写后,您可能想要执行以下操作:
Attachment
这也是写为查询表达式的不错选择:
List<MailMessage> list = new List<MailMessage>();
IEnumerable<Attachment> pdfAttachmentsCollection =
list.SelectMany(message =>
message.Attachments
.Where(attachment => attachment.Name.EndsWith(".pdf")));
这两种方法都具有相同的功能,只是语法不同。
如果您希望将其作为IEnumerable<Attachment> pdfAttachmentsCollection =
from message in list
from attachment in message.Attachments
where attachment.Name.EndsWith(".pdf")
select attachment;
,则也可以在任一查询的末尾执行List<Attachment>
。作为IEnumerable,直到开始迭代它为止,它才会被评估(并且取决于使用方式,您可能永远不会在内存中拥有完整的集合)。但是,如果您对其进行多次迭代或操作,则会导致对其进行多次评估-因此在这种情况下,.ToList()
肯定是有道理的。