Linq Group By, Skip 1 其中跳过的 1 是最近的
Linq Group By, Skip 1 where the skipped 1 was the most recent
我有一个存储在事件列表中的对象数据集(变量都已在 class 级别之前声明过):
[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 查询。
这是我到目前为止所做的但是失败了。
如果你想知道 duplicates2 是什么,这是一个失败的尝试:LINQ: Group by aggregate but still get information from the most recent row?
[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 中尝试不设置接口、classes 等,请参阅此处 https://dotnetfiddle.net/YYoSfM 和 fiddle。基本上如果测试通过,你应该在 'console window'.
中什么也得不到。
您正在跳过第一项,因此这一定是日期最长的一项。为此,您需要在 Skip
.
之前使用属于 SelectMany
内的 OrderByDescending
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-13 但应该在 2013-07-15 才能通过测试套件。
我有一个存储在事件列表中的对象数据集(变量都已在 class 级别之前声明过):
[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 查询。
这是我到目前为止所做的但是失败了。
如果你想知道 duplicates2 是什么,这是一个失败的尝试:LINQ: Group by aggregate but still get information from the most recent row?
[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 中尝试不设置接口、classes 等,请参阅此处 https://dotnetfiddle.net/YYoSfM 和 fiddle。基本上如果测试通过,你应该在 'console window'.
中什么也得不到。您正在跳过第一项,因此这一定是日期最长的一项。为此,您需要在 Skip
.
SelectMany
内的 OrderByDescending
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-13 但应该在 2013-07-15 才能通过测试套件。