ICal.net日历比较

时间:2017-06-07 06:22:09

标签: c# comparison ienumerable ical-dotnet

我一直在使用名为ICal.net的nuget软件包来加载ics文件,以检查最近添加的事件。

我在使用IEnumerable Except方法时注意到,即使您可以看到添加了更多事件,也会遗漏某些事件。

我遇到了活动中的Uid媒体资源,检查了它并注意到它的独特性 - https://github.com/rianjs/ical.net/blob/5176d27ac243eb98a01157f2ed7ff3e2852b98eb/v2/ical.NET/Interfaces/Components/IUniqueComponent.cs#L14

我使用Uid为此编写了IEqualityComparer<IEvent>,但现在所有事件都被视为新事件。

只是想知道是否有人对如何拍摄2个日历有任何建议,比较事件并获得差异?目前有2000多个事件正在增加,因此试图保持其性能。

2 个答案:

答案 0 :(得分:0)

我建议使用LINQ进行Where In查询。

假设您有两个集合(已注册且可能是新的):

List<string> registeredIds = GetRegisteredComponentsUIds();

List<ComponentImplemenation> newEvents = GetNewEvents();

List<ComponentImplemenation> result = newEvents.Where(m => registeredIds.Contains(m.Uid))
                                               .ToList();

答案 1 :(得分:0)

如果我理解正确,您有两个日历集合。一个表示具有多个VEVENT的VCALENDAR,第二个表示稍后的相同VCALENDAR + VEVENT。由于显而易见的原因,后来的VCALENDAR通常比早期的日历有更多的事件。你想比较两者,看看差异,即找到新的事件。

  • 使用A可能就足够了,而且可能不是;这取决于你的日历系统。虽然每个UID都应该是唯一的,但这取决于您的应用程序以保证。当ical.net创建一个事件时,它会执行Uid,因此如果您使用ical.net创建事件,它们应该是唯一的。谷歌日历和(我假设)其他流行的日历应用程序也提供确定性的独特UID。
  • ical.net不认为Guid.NewGuid().ToString()为了平等或散列的重要性。相反,它关注事件本身的构成。

如果您知道每个事件的UID都是唯一的,并且您没有兴趣将两个事件与不匹配的Uid进行比较,我会这样做:

Uid

这应该会为您提供第一个集合中出现的新日历ID,而不是第二个集合。

如果你想比较事件内容,我会遵循相同的模式,停在var eventIdSet = new HashSet<string>(StringComparison.OrdinalIgnoreCase); var firstEventIds = firstCalendarCollection .SelectMany(cc => cc.Event) .Select(e => e.Uid); eventIdSet.UnionWith(firstEventIds); var secondEventIds = secondCalendarCollection .SelectMany(cc => cc.Event) .Select(e => e.Uid); eventIdSet.ExceptWith(secondEventIds); 对象:

Event

这将做同样的事情,但正如我上面所说,内部var firstSet = new HashSet<Event>(); var firstEvents = firstCalendarCollection.SelectMany(cc => cc.Event); firstSet.UnionWith(firstEventIds); var secondEvents = secondCalendarCollection.SelectMany(cc => cc.Event); firstSet.ExceptWith(secondEvents); GetHashCode实现忽略了事件ID。

单独比较Equals将比比较每个Uid的全部内容更快。也就是说,除非这是一个繁忙的服务器应用程序,必须每秒多次执行此操作,否则不重要。我们正在使用ical.net,并使用800-1000个日历事件进行这样的集合操作,以及它在WPF应用程序中的毫秒计算时间。除非在极端情况下,否则您可能无法注意到Event比较与整个Uid内容比较之间的差异。

修改:我已创建了一个维基页面:https://github.com/rianjs/ical.net/wiki/Comparing-collections-of-calendar-events