private int UpdateItems(IConversationTree conversationTree, List <GroupOperationResult> results)
        {
            int num = 0;

            foreach (IConversationTreeNode conversationTreeNode in conversationTree)
            {
                for (int i = 0; i < conversationTreeNode.StorePropertyBags.Count; i++)
                {
                    if (!this.CanSkipProcessing(conversationTreeNode.StorePropertyBags[i]))
                    {
                        StoreId       storeId = conversationTreeNode.StorePropertyBags[i].TryGetProperty(ItemSchema.Id) as StoreId;
                        List <string> list    = null;
                        if (ConversationActionItem.MergeCategories(conversationTreeNode.StorePropertyBags[i].TryGetProperty(ItemSchema.Categories) as string[], this.AlwaysCategorizeValue, this.ConversationActionLastCategorySet, out list))
                        {
                            try
                            {
                                using (Item item = Microsoft.Exchange.Data.Storage.Item.Bind(base.Session, storeId, null))
                                {
                                    num++;
                                    item.OpenAsReadWrite();
                                    if (list.Count == 0)
                                    {
                                        item.Delete(ItemSchema.Categories);
                                    }
                                    else
                                    {
                                        item[ItemSchema.Categories] = list.ToArray();
                                    }
                                    item.Save(SaveMode.ResolveConflicts);
                                    results.Add(new GroupOperationResult(OperationResult.Succeeded, new StoreObjectId[]
                                    {
                                        StoreId.GetStoreObjectId(storeId)
                                    }, null));
                                }
                            }
                            catch (LocalizedException storageException)
                            {
                                results.Add(new GroupOperationResult(OperationResult.Failed, new StoreObjectId[]
                                {
                                    StoreId.GetStoreObjectId(storeId)
                                }, storageException));
                            }
                        }
                    }
                }
            }
            if (ConversationActionItem.NeedToAddCategory(this.ConversationActionLastCategorySet, this.AlwaysCategorizeValue))
            {
                this.ConversationActionLastCategorySet = this.AlwaysCategorizeValue;
            }
            return(num);
        }
        private static bool MergeCategories(IList <string> messageCategories, IList <string> categoriesCurrent, IList <string> categoriesPrev, out List <string> mergedCategories)
        {
            mergedCategories  = null;
            categoriesCurrent = ((categoriesCurrent == null) ? new List <string>() : categoriesCurrent);
            categoriesPrev    = ((categoriesPrev == null) ? new List <string>() : categoriesPrev);
            messageCategories = ((messageCategories == null) ? new List <string>() : messageCategories);
            IEnumerable <string> second     = categoriesCurrent.Except(categoriesPrev, Category.NameComparer);
            IEnumerable <string> second2    = categoriesPrev.Except(categoriesCurrent, Category.NameComparer);
            IEnumerable <string> collection = messageCategories.Except(second2).Union(second);

            mergedCategories = new List <string>(collection);
            return(ConversationActionItem.NeedToAddCategory(mergedCategories, messageCategories));
        }