【问题标题】:Linq RemoveAll for a predicate condition on a list inside the collectionLinq RemoveAll 用于集合内列表上的谓词条件
【发布时间】:2017-09-02 00:30:54
【问题描述】:

我一生都无法弄清楚这个 LINQ 查询需要是什么。我在标准 LINQ 查询上做得很好,但在这种情况下,我需要检查集合中列表中项目的条件。

任务:

我需要删除集合中的所有消息,其中他们的收件人列表没有包含特定字符串的所有句柄,即“thiscompany.com”。

我目前的尝试:

// Remove internal messages
var internalMessages = messages._results
    .Where(x => x.recipients.All(y => y.handle.Contains("somecompany.com")));
messages._results = messages._results.Except(internalMessages).ToList();

据我了解,这种方法可以正常工作,我只需要对 Message 对象实施相等检查,但由于某些原因,我无法做到这一点。我知道 LINQ 必须有一种方法来执行一个单行程序,它根据收件人列表的这个子条件删除所有消息,但我就是不知道从这里去哪里。

消息对象:

public class Message
{
    public _Links _links { get; set; }
    public string id { get; set; }
    public string type { get; set; }
    public bool is_inbound { get; set; }
    public float created_at { get; set; }
    public string blurb { get; set; }
    public Author author { get; set; }
    public List<Recipient> recipients { get; set; }
    public string body { get; set; }
    public string text { get; set; }
    public List<Attachment> attachments { get; set; }
    public MessageMetadata metadata { get; set; }
}

收件人对象:

public class Recipient
{
    public _Links _links { get; set; }
    public string handle { get; set; }
    public string role { get; set; }
}

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    cName 是您要排除的字符串。假设您将单独处理 cName 可能为 null、空或空格的事实,只需执行以下操作:

    var allMessages = messages._results;
    var externalMessages = allMessages
       .Where(message => !message.recipients.All(to => to.handle.Contains(cName)))
       .ToList();
    

    【讨论】:

      【解决方案2】:

      这样会更简单:

      message._result = messages._results
      .Where(x => x.recipients.Any(y => !y.handle.Contains("somecompany.com"))).ToList();
      

      或者

      messages._results
      .RemoveAll(x => !x.recipients.All(y => y.handle.Contains("somecompany.com")));
      

      【讨论】:

      • 如果我没看错,第一个代码 sn-p 不是说将所有结果设置为所有收件人句柄都不匹配 somecompany.com 的结果吗?我可以拥有至少一个 somecompany.com 实例,只要它们不都是 somecompany.com。我理解正确吗?
      • 我认为实际上现在我正在查看它,您的第二个代码 sn-p 基本上是我需要的,除了将 Any 换成 All。因为如果我理解正确,这将删除所有列出的所有收件人都包含 somecompany.com 的邮件。
      • 我已经更新了答案。第一个保留所有至少有一个句柄但没有“somecompany.com”的记录。第二个删除具有所有句柄的所有记录是“somecomany.com”。谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 1970-01-01
      相关资源
      最近更新 更多