我一直在使用名为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多个事件正在增加,因此试图保持其性能。
答案 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。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