Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 根据列表包含的另一个列表中的属性筛选列表_C#_.net_List_Linq - Fatal编程技术网

C# 根据列表包含的另一个列表中的属性筛选列表

C# 根据列表包含的另一个列表中的属性筛选列表,c#,.net,list,linq,C#,.net,List,Linq,我有一个order对象,其部分类包含更改历史: public class SomeOrder { public string SomeOrderNumber { get; set; } public string Status { get; set; } public IEnumerable<SomeOrderChangesHistory> ChangesHistory { get; set; } } public partial class SomeOrd

我有一个order对象,其部分类包含更改历史:

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
{
公共字符串SomeOrderNumber{get;set;}
公共字符串状态{get;set;}
公共IEnumerable变更存储{get;set;}
}
公共部分类SomeOrderChangesStory
{
公共字符串PropertyName{get;set;}
公共字符串OldValue{get;set;}
公共字符串NewValue{get;set;}
公共日期时间日期时间UTC{get;set;}
公共字符串用户名{get;set;}
}
我将得到一个
SomeOrder
的列表,如果这些订单是由
api用户更新的,我想过滤掉它们。由
api user
更新的订单将在
someorderchangestory
类中为
UserName
属性提供
api user

因此本质上,它是一种基于
SomeOrderChangesTory
对象的
UserName
属性过滤
List
的情况,该对象的列表,即
IEnumerable
位于
SomeOrder
对象内

我如何做到这一点

谢谢

尝试使用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;
}
public List filterordersupdatedbyapuser(列表顺序)
{
var ordersUpdatedbyAPIUser=订单
.Where(x=>x.ChangesHistory?.OrderByDescending(y=>y.DateTimeUtc)
.FirstOrDefault()?.UserName==“api用户”)
.Select(on=>on.SomeOrderNumber);
orders.RemoveAll(r=>ordersUpdatedbyAPIUser.Any(a=>a==r.SomeOrderNumber));
退货订单;
}
它将过滤由
api用户更新的所有订单

使用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;
}
public List filterordersupdatedbyapuser(列表顺序)
{
var ordersUpdatedbyAPIUser=订单
.Where(x=>x.ChangesHistory?.OrderByDescending(y=>y.DateTimeUtc)
.FirstOrDefault()?.UserName==“api用户”)
.Select(on=>on.SomeOrderNumber);
orders.RemoveAll(r=>ordersUpdatedbyAPIUser.Any(a=>a==r.SomeOrderNumber));
退货订单;
}

它将过滤所有由
api用户更新的订单

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