CSharp StringBuilder extension methods.

using System;
using System.Text;

namespace Extensions
{
    static class StringBuilderExtensions
    {
        public static StringBuilder AppendLineFormat(this StringBuilder self, string format, params object[] arguments)
        {
            string value = string.Format(format, arguments);
            self.AppendLine(value);

            return self;
        }

        public static StringBuilder AppendWhen(this StringBuilder self, bool condition, params string[] values)
        {
            if (condition)
                foreach (var value in values)
                    self.Append(value);

            return self;
        }

        public static StringBuilder AppendWhen(this StringBuilder self, bool condition, params char[] values)
        {
            if (condition)
                foreach (var value in values)
                    self.Append(value);

            return self;
        }

        public static StringBuilder AppendFormatWhen(this StringBuilder self, bool condition, string format, params object[] args)
        {
            return condition
                ? self.AppendFormat(format, args)
                : self;
        }

        public static StringBuilder AppendIf(this StringBuilder self, bool condition, string ifTrue, string ifFalse)
        {
            return condition
                ? self.Append(ifTrue)
                : self.Append(ifFalse);
        }

        public static StringBuilder BimapIf(this StringBuilder self, bool condition,
            Func<StringBuilder, StringBuilder> ifTrue, Func<StringBuilder, StringBuilder> ifFalse)
        {
            return condition
                ? ifTrue(self)
                : ifFalse(self);
        }

        public static StringBuilder MapIf(this StringBuilder self, bool condition,
            Func<StringBuilder, StringBuilder> ifTrue)
        {
            return condition
                ? ifTrue(self)
                : self;
        }

        public static StringBuilder AppendIfNotEmpty(this StringBuilder self, params string[] values)
        {
            foreach (var value in values)
                if (value.Length > 0)
                    self.Append(value);

            return self;
        }

        public static string SafeToString(this StringBuilder self)
        {
            return self == null
                ? string.Empty
                : self.ToString();
        }

        public static int SafeLength(this StringBuilder self)
        {
            return self == null ? 0 : self.Length;
        }

        public static StringBuilder TrimEnd(this StringBuilder self, char c)
        {
            return self.Length > 0
                ? self.Remove(self.Length - 1, 1)
                : self;
        }

        public static StringBuilder TrimEndIfMatch(this StringBuilder self, char c)
        {
            if (self.Length > 0)
                if (self[self.Length - 1] == c)
                    self.Remove(self.Length - 1, 1);

            return self;
        }

        public static StringBuilder TrimEndIfMatchWhen(this StringBuilder self, bool condition, char c)
        {
            return condition
                ? self.TrimEndIfMatch(c)
                : self;
        }

        public static int TrailingSpaces(this StringBuilder self)
        {
            var bound = self.Length - 1;
            if (self.Length == 0) return 0;
            if (self[bound] != ' ') return 0;
            var c = 0;
            for (var i = bound; i <= bound; i--)
            {
                if (i < 0) break;
                if (self[i] != ' ') break;
                c++;
            }
            return c;
        }
    }
}