C# Linq Group By,跳过1,其中跳过的1是最近的

C# Linq Group By,跳过1,其中跳过的1是最近的,c#,linq,unit-testing,tdd,C#,Linq,Unit Testing,Tdd,我有一组存储在事件列表中的对象数据集(变量都已在类级别声明): 但是,现在我想提取具有最低日期的副本,我不太确定如何调整linq查询设置 这是我迄今为止所做的,但它失败了 如果您想知道duplicates2是什么,那么实现此功能的尝试将失败: 如果您想在不必在VisualStudio中设置接口、类等的情况下进行尝试,请参阅此处并进行修改。基本上,如果测试通过,您应该在“控制台窗口”中什么也得不到。您正在跳过第一项,因此这必须是日期最长的一项。要实现这一点,您需要使用OrderByDescendi

我有一组存储在事件列表中的对象数据集(变量都已在类级别声明):

但是,现在我想提取具有最低日期的副本,我不太确定如何调整linq查询设置

这是我迄今为止所做的,但它失败了

如果您想知道duplicates2是什么,那么实现此功能的尝试将失败:


如果您想在不必在VisualStudio中设置接口、类等的情况下进行尝试,请参阅此处并进行修改。基本上,如果测试通过,您应该在“控制台窗口”中什么也得不到。

您正在跳过第一项,因此这必须是日期最长的一项。要实现这一点,您需要使用
OrderByDescending
,它位于
SelectMany
中的
Skip
之前

 var duplicates = events
            .GroupBy(s => s.TableKey)
            .SelectMany(grp => grp.OrderByDescending(e => e.EventTime)
                                  .Skip(1))
            .ToList();
如果希望其余副本按升序排序,只需在
跳过
之后添加一个
.OrderBy(e=>e.EventTime)

 var duplicates = events
            .GroupBy(s => s.TableKey)
            .SelectMany(grp => grp.OrderByDescending(e => e.EventTime)
                                  .Skip(1))
            .ToList();

哦,你的测试数据是假的。
PERSON\u code=1
的第一个数据项是2013-07-13,但应该在2013-07-15通过测试套件。

哦,是的,关于测试数据,你是对的。我不小心改变了日期而不是时间!
    [Test]
    public void pickDuplicateEventWithLeastDate()
    {
        var duplicates = events
            //.OrderBy(e => e.EventTime)
            .GroupBy(s => s.TableKey)
            .SelectMany(grp => grp.Skip(1))
            .ToList();

        var duplicates2 = from res in events
                          group res by res.TableKey into g
                          select new
                          {
                              Count = g.Count(),
                              MemberID = g.Key,
                              MostRecent = g.OrderByDescending(x => x.EventTime)
                              .First()
                          };

        Assert.AreEqual(2, duplicates.Count);
        var e1 = duplicates[0];
        var e2 = duplicates[1];

        Assert.AreEqual(e1.EventTime, Convert.ToDateTime("2013-07-15 13:00:00"));
        Assert.AreEqual(e2.EventTime, Convert.ToDateTime("2013-07-15 13:00:00"));
    }
 var duplicates = events
            .GroupBy(s => s.TableKey)
            .SelectMany(grp => grp.OrderByDescending(e => e.EventTime)
                                  .Skip(1))
            .ToList();