簡體   English   中英

Linq Group By,跳過1,其中跳過的1是最近的

[英]Linq Group By, Skip 1 where the skipped 1 was the most recent

我有一個存儲在事件列表中的對象的數據集(所有變量都已在類級別聲明過):

    [SetUp]
    public void Setup()
    {
        eventLogObj = new EventLogObj();

        event1 = new EventLogObj() { RecordId = 1, TableKey = "PERSON_CODE=1", Status = "S", EventTime = Convert.ToDateTime("2013-07-15 14:00:00") };
        event2 = new EventLogObj() { RecordId = 2, TableKey = "PERSON_CODE=2", Status = "S", EventTime = Convert.ToDateTime("2013-07-15 13:00:00") };
        event3 = new EventLogObj() { RecordId = 3, TableKey = "PERSON_CODE=3", Status = "S", EventTime = Convert.ToDateTime("2013-07-15 13:00:00") };
        event4 = new EventLogObj() { RecordId = 4, TableKey = "PERSON_CODE=2", Status = "S", EventTime = Convert.ToDateTime("2013-07-15 14:00:00") };
        event5 = new EventLogObj() { RecordId = 5, TableKey = "PERSON_CODE=1", Status = "S", EventTime = Convert.ToDateTime("2013-07-15 13:00:00") };

        events = new List<EventLogObj>() { event1, event2, event3, event4, event5 };
    }

我最初只是提取重復項-奏效(下)

    [Test]
    public void StoreOnlyDuplicateDetailsFromRowsIntoCollection()
    {
        var duplicates = events.GroupBy(s => s.TableKey)
            .SelectMany(grp => grp.Skip(1)).ToList();

        Assert.AreEqual(2, duplicates.Count);
    }

但是,現在我想提取日期最少的重復項,而且我不太確定如何調整我設置的linq查詢。

這是我到目前為止所做的,但是失敗了。

如果您想知道重復項2是什么,則嘗試實現此操作失敗: LINQ:按匯總分組,但仍從最新行中獲取信息嗎?

    [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"));
    }

如果您想嘗試而不必在Visual Studio中設置接口,類等,請參見https://dotnetfiddle.net/YYoSfM並進行擺弄。 基本上,如果測試通過,則您在“控制台窗口”中什么也不會獲得。

您正在跳過第一項,因此該日期必須是最高的日期。 為此,您需要使用OrderByDescending ,它位於SelectMany內部,就在Skip之前。

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

如果您希望將其余重復項按升序排序,只需在Skip之后添加.OrderBy(e => e.EventTime)

哦,您的測試數據是虛假的。 PERSON_CODE=1的第一個數據項是2013-07-1 3,但應在2013-07-1 5上才能通過測試套件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM