/// <summary>sends COMPARATOR command</summary>
        /// <remarks>valid in authenticated/selected state</remarks>
        public ImapCommandResult Comparator(out ImapCollationAlgorithm activeComparator)
        {
            /*
               * RFC 5255 - Internet Message Access Protocol Internationalization
               * http://tools.ietf.org/html/rfc5255
               * 4.7. COMPARATOR Command
               *    When issued with no arguments, it results in a
               *    COMPARATOR response indicating the currently active comparator.
               */
              activeComparator = null;

              using (var t = new ComparatorTransaction(connection)) {
            if (ProcessTransaction(t).Succeeded) {
              this.activeComparator = t.Result.Value.Item1;

              activeComparator = t.Result.Value.Item1;
            }

            return t.Result;
              }
        }
        /// <summary>sends COMPARATOR command</summary>
        /// <remarks>valid in authenticated/selected state</remarks>
        public ImapCommandResult Comparator(out ImapCollationAlgorithm[] matchingComparators, ImapCollationAlgorithm comparator, params ImapCollationAlgorithm[] comparators)
        {
            ImapCollationAlgorithm discard;

              return Comparator(out discard, out matchingComparators, comparator, comparators);
        }
        /// <summary>sends COMPARATOR command</summary>
        /// <remarks>valid in authenticated/selected state</remarks>
        public ImapCommandResult Comparator(out ImapCollationAlgorithm activeComparator, out ImapCollationAlgorithm[] matchingComparators, ImapCollationAlgorithm comparator, params ImapCollationAlgorithm[] comparators)
        {
            RejectNonAuthenticatedState();

              if (comparator == null)
            throw new ArgumentNullException("comparator");

              var comparatorArguments = new List<ImapCollationAlgorithm>();

              comparatorArguments.Add(comparator);

              if (comparators != null) {
            for (var i = 0; i < comparators.Length; i++) {
              if (comparators[i] == null)
            throw new ArgumentNullException(string.Format("comparators[{0}]", i));

              comparatorArguments.Add(comparators[i]);
            }
              }

              activeComparator = null;
              matchingComparators = null;

              /*
               * RFC 5255 - Internet Message Access Protocol Internationalization
               * http://tools.ietf.org/html/rfc5255
               * 4.7. COMPARATOR Command
               *    When issued with one or more comparator arguments, it changes the
               *    active comparator as directed.
               */
              using (var t = new ComparatorTransaction(connection)) {
            t.RequestArguments["comparator order arguments"] = new ImapStringList(comparatorArguments.ConvertAll(delegate(ImapCollationAlgorithm comp) {
              return new ImapQuotedString(comp.ToString());
            }).ToArray());

            if (ProcessTransaction(t).Succeeded) {
              this.activeComparator = t.Result.Value.Item1;

              activeComparator = t.Result.Value.Item1;
              matchingComparators = t.Result.Value.Item2 ?? new ImapCollationAlgorithm[0];
            }

            return t.Result;
              }
        }
        /// <summary>sends COMPARATOR command</summary>
        /// <remarks>valid in authenticated/selected state</remarks>
        public ImapCommandResult Comparator(ImapCollationAlgorithm comparator, params ImapCollationAlgorithm[] comparators)
        {
            ImapCollationAlgorithm discard1;
              ImapCollationAlgorithm[] discard2;

              return Comparator(out discard1, out discard2, comparator, comparators);
        }