【问题标题】:Filter a list based on a property that is inside another list it contains根据列表包含的另一个列表中的属性过滤列表
【发布时间】:2020-09-11 17:25:33
【问题描述】:

我有一个订单对象,其部分类包含更改历史记录:

public class SomeOrder
{
    public string SomeOrderNumber { get; set; }
    public string Status { get; set; }
    public IEnumerable<SomeOrderChangesHistory> ChangesHistory { get; set; }
}

public partial class SomeOrderChangesHistory
{
    public string PropertyName { get; set; }
    public string OldValue { get; set; }
    public string NewValue { get; set; }
    public DateTime DateTimeUtc { get; set; }
    public string UserName { get; set; }
}

我将获得SomeOrder 的列表,如果订单由api user 更新,我想过滤掉它们。由api user 更新的订单将在SomeOrderChangesHistory 类中具有UserName 属性的api user 值。

所以本质上它是基于SomeOrderChangesHistory 对象的UserName 属性过滤List&lt;SomeOrder&gt; 的情况,该对象的列表,即IEnumerable&lt;SomeOrderChangesHistory&gt;SomeOrder 对象内。

我该如何做到这一点?

谢谢!

【问题讨论】:

  • “过滤掉”是什么意思?你在使用 EF/EF Core 吗?
  • @NetMage EF 并没有为此发挥作用。我刚刚收到一个 JSON 响应,然后将其解析为 C# 对象,我需要删除由 api user 更新的订单,因为我只需要由人更新的订单。下面发布的答案解决了我的问题,但我不知道为什么它被否决了。
  • (不是我。)可能是因为应该使用 LINQ 来创建具有所需标准的新集合,并且在名为 Filter 的方法中修改原始列表似乎是个坏主意,尤其是因为它返回一个List,它与传入的相同(对流利的编程很有用,如果你期望 LINQ 行为则不好)。最好命名为 Remove... 还有很多不必要的空值检查 (?.)。
  • 使用 LINQ,您可以期望执行类似 var peopleOrders = orders.Where(o =&gt; !o.ChangeHistory.Any(ch =&gt; ch.UserName == "api user")).ToList() 的操作。
  • @NetMage 谢谢,你的回答看起来很简洁。

标签: c# .net list linq


【解决方案1】:

使用 LINQ 试试这个:

public List<SomeOrder> FilterOrdersUpdatedByAPIUser(List<SomeOrder> orders)
{
    var ordersUpdatedbyAPIUser = orders
                                .Where(x => x.ChangesHistory?.OrderByDescending(y => y.DateTimeUtc)
                                .FirstOrDefault()?.UserName == "api user")
                                .Select(on => on.SomeOrderNumber);

    orders.RemoveAll(r => ordersUpdatedbyAPIUser.Any(a => a == r.SomeOrderNumber));
    return orders;
}

它将过滤您所有由api user更新的订单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    相关资源
    最近更新 更多