C# linq 选择列表中的对象查看另一个对象列表

Gau*_*vsa 4 c# linq

我有一个这样的课程:

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”

gre*_*mac 5

几个问题:

  • 您需要SelectManyMailMessage对象中获取单个集合中的所有附件
  • 您正在选择y.Content哪个是byte[]但试图获取列表Attachment
  • LINQ 返回 IEnumerables,而不是列表

重写后,您可能想要执行以下操作:

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()肯定是有道理的。