C# 使用LINQ对对象进行区分

C# 使用LINQ对对象进行区分,c#,linq,linq-to-objects,C#,Linq,Linq To Objects,我的数据如下图所示 所以我将它加载到一个集合中,使用anon对象绕过创建类 List<dynamic> myList = new List<dynamic>() { new { WorkOrderID = 40001, LastUpdatedAt = DateTime.Parse("2018-10-02"), Col3 = "abc",

我的数据如下图所示

所以我将它加载到一个集合中,使用anon对象绕过创建类

List<dynamic> myList = new List<dynamic>()
        {
            new {
                WorkOrderID = 40001,
                LastUpdatedAt = DateTime.Parse("2018-10-02"),
                Col3 = "abc",
                Col4 = "xyz"
            },
            new {
                WorkOrderID = 40001,
                LastUpdatedAt = DateTime.Parse("2017-06-01"),
                Col3 = "abc",
                Col4 = "xyz"
            },
            new {
                WorkOrderID = 40002,
                LastUpdatedAt = DateTime.Parse("2018-07-01"),
                Col3 = "abc",
                Col4 = "xyz"
            },
            new {
                WorkOrderID = 40003,
                LastUpdatedAt = DateTime.Parse("2018-09-01"),
                Col3 = "abc",
                Col4 = "xyz"
            },
            new {
                WorkOrderID = 40001,
                LastUpdatedAt = DateTime.Parse("2016-01-01"),
                Col3 = "abc",
                Col4 = "xyz"
            },
            new {
                WorkOrderID = 40002,
                LastUpdatedAt = DateTime.Parse("2016-12-01"),
                Col3 = "abc",
                Col4 = "xyz"
            },
        };
List myList=new List()
{
新的{
WorkOrderID=40001,
LastUpdatedAt=DateTime.Parse(“2018-10-02”),
Col3=“abc”,
Col4=“xyz”
},
新的{
WorkOrderID=40001,
LastUpdatedAt=DateTime.Parse(“2017-06-01”),
Col3=“abc”,
Col4=“xyz”
},
新的{
WorkOrderID=40002,
LastUpdatedAt=DateTime.Parse(“2018-07-01”),
Col3=“abc”,
Col4=“xyz”
},
新的{
WorkOrderID=40003,
LastUpdatedAt=DateTime.Parse(“2018-09-01”),
Col3=“abc”,
Col4=“xyz”
},
新的{
WorkOrderID=40001,
LastUpdatedAt=DateTime.Parse(“2016-01-01”),
Col3=“abc”,
Col4=“xyz”
},
新的{
WorkOrderID=40002,
LastUpdatedAt=DateTime.Parse(“2016-12-01”),
Col3=“abc”,
Col4=“xyz”
},
};
如何使用Linq to对象仅提取最近更新的不同工作顺序

换句话说,我应该以橙色突出显示的3行结束

var myFilteredList=myList.GroupBy(//?完全丢失…帮助


如果我没有误解的话,您希望每个工作订单都有最新的项目

var latestWorkOrders = myList
    .GroupBy(w => w.WorkOrderID)
    .Select(g => g.OrderByDescending(w => w.LastUpdatedAt).First());

它将按
工作订单ID
进行分组,并为每个分组选择最新的项目。

如果我没有误解,您希望每个工作订单都有最新的项目

var latestWorkOrders = myList
    .GroupBy(w => w.WorkOrderID)
    .Select(g => g.OrderByDescending(w => w.LastUpdatedAt).First());

它将按
WorkOrderID
进行分组,并为每个分组选择最新的项。

以下使用
GroupBy
重载,以便可以在同一调用中完成元素选择,并将它们转换为强类型匿名对象

var myFilteredList = myList
    .GroupBy(_ => (int)_.WorkOrderID, (k, g) =>
    {
        var recent = g.OrderByDescending(_ => _.LastUpdatedAt).First();
        return new
        {
            WorkOrderID = k,
            LastUpdatedAt = (DateTime)recent.LastUpdatedAt,
            Col3 = (string)recent.Col3,
            Col4 = (string)recent.Col4
        };
    });

下面使用了
GroupBy
重载,因此可以在同一调用中完成元素选择,并将它们转换为强类型匿名对象

var myFilteredList = myList
    .GroupBy(_ => (int)_.WorkOrderID, (k, g) =>
    {
        var recent = g.OrderByDescending(_ => _.LastUpdatedAt).First();
        return new
        {
            WorkOrderID = k,
            LastUpdatedAt = (DateTime)recent.LastUpdatedAt,
            Col3 = (string)recent.Col3,
            Col4 = (string)recent.Col4
        };
    });

这样更干净


这更干净。

如果你能明确表示你所期望的结果,那将是非常棒的。如果你能明确表示你所期望的结果,那将是非常棒的。i分组不包含LastUpdatedAt的定义。i分组不包含LastUpdatedAt的定义。你的左手边是latestWorkOrders吗LINQ查询,而不是最终结果?例如,我仍然需要执行var finalList=latestWorkOrders.ToList()对不起,是的。这是一个LINQ查询,所以您需要
.ToList()
。您左手边的latestWorkOrders是一个LINQ查询,而不是最终结果吗?例如,我仍然需要执行var finalList=latestWorkOrders.ToList()抱歉,是的。这是一个LINQ查询,因此您需要
.ToList()
。感谢您的回答,它确实有效,但我使用了第一个正确的答案;您的左手边是一个LINQ查询,而不是最终列表,缺少一个.ToList()最后是否强制转换?感谢您的回答,它确实有效,但我使用了第一个正确的回答;您的左手边是一个linq查询,而不是最后的列表,在末尾缺少一个.ToList()强制转换?