C#linq在列表中选择对象,在另一个对象列表中查找

时间:2018-11-23 03:58:08

标签: 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;}   

}

我想获取附件集合中所有名称以.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'

1 个答案:

答案 0 :(得分:4)

几个问题:

  • 您需要SelectMany对象中的MailMessage才能在单个集合中获取所有附件
  • 您正在选择y.Content的{​​{1}},但尝试获取byte[]的列表
  • LINQ返回IEnumerables,而不是列表

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

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