LINQ 查询以在列表中查找其属性之一具有相等值的对象

Jac*_*ins 0 c# linq loops

我正在遍历一个列表并寻找其属性之一具有相同值的对象。我需要重叠的属性的唯一值的 IEnumerable。

这是我原来的嵌套循环解决方案。

List<Event> eventsWithDatetimeCollisions = new List<Event>();
for (int i = 0; i < eventList.Count; i++)
{
    Event event1 = eventList[i];

    for (int j = i + 1; j < eventList.Count; j++) // for each event after event1 in the list
    {
        Event event2 = eventList[j];
    
        if (DateTime.Compare(event1.EventDateTime, event2.EventDateTime) == 0)
            eventsWithDatetimeCollisions.Add(event1);
    }
}
Run Code Online (Sandbox Code Playgroud)

@NetMage 指出了我的循环解决方案中的一个错误,如果有 3 个事件同时发生,第一个将被添加到列表中两次,第二个将被添加一次。我的 LINQ 解决方案也存在类似的问题。

我想出了以下查询,它几乎给了我想要的结果,但它有一些重复的值,我想知道它是否可以写得更好。我正在手动检查事件是否不同,有没有办法避免这种情况?据我了解,此查询会将每个事件与列表中的每个事件(包括其自身)进行比较,从而导致许多额外的比较。

var dateTimeCollisions = from event1 in eventList
                         from event2 in eventList
                         where event1 != event2   // I want to avoid this bit 
                               && DateTime.Compare(event1.EventDateTime, event2.EventDateTime) == 0
                         select event1;
Run Code Online (Sandbox Code Playgroud)

这不是需要优化速度的东西,大多数情况下,列表中的项目少于 5 个,并且不会定期或短时间执行,我只是好奇是否有更好的方法(更有效) ,更容易读/写等)。

sid*_*cus 5

GroupBy 在这里可能是一个更好的选择——更多的内存但低得多的复杂性。

eventList.GroupBy(x => x.EventDateTime).Where(g => g.Count() > 1)
Run Code Online (Sandbox Code Playgroud)

每个组的键是碰撞日期时间,值是在该时间发生碰撞的事件。

添加.Select(g => g.Key)只会给你日期时间。