private string ModifyString(
            string?source,
            string?key,
            EncryptionModificationMethod modificationMethod)
        {
            VerifyModificationMethod(modificationMethod);

            if (string.IsNullOrEmpty(source) || string.IsNullOrEmpty(key))
            {
                return(source ?? "");
            }

            StringBuilder resultString = new StringBuilder();

            for (int i = 0; i < source.Length; i++)
            {
                ushort sourceCharCode = Convert.ToUInt16(source[i]);
                ushort keyCharCode    = Convert.ToUInt16(key[i % key.Length]);
                ushort resultCharCode;
                if (modificationMethod == EncryptionModificationMethod.Encrypt)
                {
                    resultCharCode = (ushort)unchecked (sourceCharCode + keyCharCode);
                }

                else
                {
                    resultCharCode = (ushort)unchecked (sourceCharCode - keyCharCode);
                }

                char resultCharacter = Convert.ToChar(resultCharCode);
                resultString.Append(resultCharacter);
            }

            return(resultString.ToString());
        }
 private void VerifyModificationMethod(EncryptionModificationMethod modificationMethod)
 {
     if (modificationMethod != EncryptionModificationMethod.Encrypt &&
         modificationMethod != EncryptionModificationMethod.Decrypt)
     {
         throw new ArgumentException(
                   "modifictionMethod parameter should be " +
                   $"\"Encrypt\" or \"Decrypt\"");
     }
 }
        private IEnumerable <string> ModifyCollection(
            IEnumerable <string>?source,
            string?key,
            EncryptionModificationMethod modificationMethod)
        {
            if (source == null || source.Count() == 0)
            {
                yield return("");
            }

            else
            {
                int limitOfBufferLength = byte.MaxValue;
                var bufferSource        = source.Take(limitOfBufferLength);
                foreach (string str in bufferSource)
                {
                    yield return(ModifyString(str, key, modificationMethod));
                }
            }
        }