Si je vous comprends bien, vous avez deux collections de calendriers. L'un représente un VCALENDAR avec plusieurs VEVENT et le second représente le même VCALENDAR + VEVENT à un moment ultérieur. Souvent, le VCALENDAR plus tard a plus d'événements que le calendrier précédent, pour des raisons évidentes. Et vous voulez comparer les deux pour voir la différence, c'est-à-dire trouver les nouveaux événements.
- L'utilisation de
Uid
peut être suffisante et peut ne pas l'être; Cela dépend de votre système d'agenda. Bien que chaque UID soit unique, c'est à votre application de garantir. Quand ical.net crée un événement, il fait Guid.NewGuid().ToString()
, donc si vous utilisez ical.net pour créer des événements, ils doivent être uniques. Google Calendar et (je suppose) d'autres applications de calendrier populaires fournissent également des Uids déterministes.
- ical.net ne considère pas le
Uid
significatif à des fins d'égalité ou de hachage. Au lieu de cela, il prête attention à la composition des événements eux-mêmes.
Si vous savez que UID est unique, et vous avez aucun intérêt à comparer deux événements avec UIDS inégalés de chaque événement, je ferais quelque chose comme ceci:
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);
Cela devrait vous donner le nouveau calendrier ids présents dans la première collection, mais pas la seconde.
Si vous voulez comparer le contenu de l'événement, je ferais le même schéma, arrêt à l'objet 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);
Cela va faire la même chose, mais comme je l'ai dit plus haut, ids d'événement sont ignorés par les implémentations internes GetHashCode
et Equals
. Comparer Uid
s seul sera plus rapide que de comparer le contenu entier de chaque Event
. Cela dit, à moins que ce soit une application serveur occupée qui doit le faire plusieurs fois par seconde, cela ne devrait pas avoir d'importance. Nous utilisons ical.net, et effectuons des opérations comme celle-ci avec 800-1000 événements de calendrier, et des millisecondes de temps de calcul dans une application WPF.Vous ne remarquerez probablement pas la différence entre les comparaisons Uid
et toute la comparaison de contenu Event
sauf dans des circonstances extrêmes.
Edit: J'ai créé une page wiki: https://github.com/rianjs/ical.net/wiki/Comparing-collections-of-calendar-events
Découvrez blog Marius Schulz au sujet des mises en garde considèrent l'exception (https://blog.mariusschulz.com/2011/08/08/why-enumerableexcept-might -not-work-the-way-you-could-expect) – robjam