// ========================================================================
//
// Copyright (C) 2016-2017 MARC CHEVALDONNE
//                         marc.chevaldonne.free.fr
//
// Module        : Program.cs
// Author        : Marc Chevaldonné
// Creation date : 2016-09-22
//
// ========================================================================

using System;
using static System.Console;

namespace ex_006_001_string
{
    class Program
    {
        static void Main(string[] args)
        {
            OutputEncoding = System.Text.Encoding.UTF8;

            WindowHeight = LargestWindowHeight;
            WindowWidth += 15;

            WriteLine("STRING : Chaîne de caractères immuable");

            //construction
            WriteLine("CONSTRUCTION");
            string s1 = "Bonjour";

            //caractères spéciaux avec le caractère d'échappement \
            WriteLine("CARACTERES SPECIAUX");
            string s2 = "\'coucou1\' \"coucou2\" \\coucou3\\";
            WriteLine(s2);
            s2 = "nouvelle\nligne";
            WriteLine(s2);
            s2 = "retour\rcharriot";
            WriteLine(s2);
            s2 = "horizontal\ttab";
            WriteLine(s2);
            s2 = "alerte audio \a"; // \a fait un son lorsque le string est affiché
            WriteLine(s2);

            //verbatim
            WriteLine("\n VERBATIM");
            string s3 = "\\\\server\\machin\\trucmuche\\home"; // chaîne non verbatim, il faut utiliser le caractère d'échappement pour afficher 
                                                               // les backslashs
            WriteLine(s3);
            s3 = @"\\server\machin\truchmuche\home";           // chaîne verbatim, les caractères spéciaux sont traités comme les autres
            WriteLine(s3);

            //string vide
            WriteLine("\n CHAINE DE CARACTERES VIDE");
            string s4 = "";
            WriteLine($"la chaîne de caractères : \"{s4}\" a une longueur de : {s4.Length} caractère(s)");
            //ou
            s4 = String.Empty;
            WriteLine($"la chaîne de caractères : \"{s4}\" a une longueur de : {s4.Length} caractère(s)");
            WriteLine($"s4 == \"\" ? {s4 == ""}");
            WriteLine($"s4 == String.Empty ? {s4 == string.Empty}");
            WriteLine($"s4.Length == 0 ? {s4.Length == 0}");

            //string null (string est reference type)
            WriteLine("\n CHAINE DE CARACTERES NULLE");
            string s5 = null;
            WriteLine($"s5 == \"\" ? {s5 == ""}");
            try
            {
                WriteLine($"s5.Length == 0 ? {s5.Length == 0}");
            }
            catch
            {
                WriteLine($"s5.Length == 0 ? False");
            }

            WriteLine($"string.IsNullOrEmpty(s4) ? {string.IsNullOrEmpty(s4)}");
            WriteLine($"string.IsNullOrEmpty(s5) ? {string.IsNullOrEmpty(s5)}");
            WriteLine($"string.IsNullOrWhiteSpace(\"   \") ? {string.IsNullOrWhiteSpace("   ")}");

            //accéder et chercher dans les string
            WriteLine($"\n RECHERCHER DANS LES STRING");
            string s6 = "barbapapa";
            WriteLine(s6);
            WriteLine($"3ème caractère : {s6[2]}");
            WriteLine($"s6.Contains(\"pa\") ? {s6.Contains("pa")}");
            WriteLine($"s6.EndsWith(\"pa\") ? {s6.EndsWith("pa")}");
            WriteLine($"s6.StartsWith(\"ba\") ? {s6.StartsWith("ba")}");
            WriteLine($"s6.IndexOf(\"ba\") ? {s6.IndexOf("ba")}");

            //manipuler les string
            WriteLine($"\n MANIPULER LES STRING");
            WriteLine($"CONCATENATION DE STRING");
            //concatenation de string
            string s7 = "Jim" + " " + "Raynor";
            WriteLine($"\"Jim\" + \" \" + \"Raynor\" = \"{s7}\"");
            //substring
            WriteLine($"SUBSTRING");
            string s8 = s7.Substring(0, 3);
            WriteLine($"\"Jim Raynor\".Substring(0, 3) = {s8}");
            s8 = s7.Substring(2, 3);
            WriteLine($"\"Jim Raynor\".Substring(2, 3) = {s8}");
            s8 = s7.Substring(5);
            WriteLine($"\"Jim Raynor\".Substring(5) = {s8}");

            //insert, remove, replace, ToUpper, ToLower
            WriteLine($"REMOVE");
            s8 = s7.Remove(2, 3);
            WriteLine($"\"Jim Raynor\".Remove(2, 3) = {s8}");
            WriteLine($"INSERT");
            s8 = s8.Insert(2, "m R");
            WriteLine($"\"Jiaynor\".Insert(2, \"m R\") = {s8}");
            WriteLine($"REPLACE");
            s8 = "Les chaussettes de l'archiduchesse";
            s8 = s8.Replace(" ", "_");
            WriteLine($"\"Les chaussettes de l'archiduchesse\".Replace(\" \", \"_\") = {s8}");
            WriteLine($"TO UPPER, TO LOWER");
            s8 = s8.ToUpper();
            WriteLine($"\"Les_chaussettes_de_l'archiduchesse\".ToUpper() = {s8}");
            s8 = s8.ToLower();
            WriteLine($"\"LES_CHAUSSETTES_DE_L'ARCHIDUCHESSE\".ToLower() = {s8}");


            //PadLeft, PadRight
            WriteLine("\n PADLEFT, PADRIGHT, TRIM");
            s8 = s8.PadLeft(50).PadRight(60, '!');
            WriteLine($"\"les_chaussettes_de_l'archiduchesse\".PadLeft(50).PadRight(60, \'!\') = \n{s8}");


            //Trim : enlève les blancs (whitespace, tab, new lines...)
            s8 = s8.Trim(); //existe aussi avec TrimStart et TrimEnd
            WriteLine($"\"                les_chaussettes_de_l'archiduchesse!!!!!!!!!!\".Trim() = \n{s8}");

            //Split et Join
            WriteLine("\n SPLIT ET JOIN");
            s8 = "Les chaussettes de l'archiduchesse";
            WriteLine($"\"{s8}\" est composé des mots suivants \n(\"Les chaussettes de l'archiduchesse\".Split()): ");
            string[] mots = s8.Split();
            foreach (string m in mots)
            {
                WriteLine($"\t- {m}");
            }
            WriteLine("On peut regrouper les mots précédents (tableau de string : string[] mots;) avec Join");
            string s9 = string.Join(" ", mots);
            WriteLine($"string.Join(\" \", mots) = {s9}");

            //Format
            WriteLine("\n STRING.FORMAT");
            string format = "Il y a {0} élèves inscrits en {1} année à l'IUT pour l'année scolaire {2}";
            WriteLine("Le format : \"{0}\"", format);
            string chaineFormatée = string.Format(format, 110, "2ème", "2011-2012");
            WriteLine("chaîne formatée avec le format : {0}", chaineFormatée);
            WriteLine("on peut aussi tout faire dans le WriteLine, sans préciser string.Format : ");
            WriteLine("Il y a {0} élèves inscrits en {1} année à l'IUT pour l'année scolaire {2}", 110, "2ème", "2010-2011");
            format = "Nb élèves : {0, -5} Année : {1, -5} Année universitaire : {2, 15}";
            WriteLine("format plus élaboré, pour imposer des tailles : \n{0}", format);
            WriteLine("Quelques chaînes formatées (avec ou sans string.Format pour voir la différence d'écriture) : ");
            chaineFormatée = string.Format(format, 110, "2ème", "2010-2011");
            WriteLine(chaineFormatée);
            chaineFormatée = "Nb élèves : " + 110.ToString().PadRight(5) + " Année : " + "2ème".PadRight(5) + " Année universitaire : " + "2010-2011".PadLeft(15);
            WriteLine(chaineFormatée);
            chaineFormatée = "Nb élèves : " + 98.ToString().PadRight(5) + " Année : " + "2ème".PadRight(5) + " Année universitaire : " + "2010-2011".PadLeft(15);
            WriteLine(chaineFormatée);

            //String Interpolation
            WriteLine("\n STRING INTERPOLATION avec $");
            WriteLine($"Il y a {135} élèves inscrits en {"1ère"} année à l'IUT pour l'année scolaire {"2016 - 2017"}");

            //comparaison de string
            WriteLine("\n COMPARAISON DE STRING");
            //equality comparison
            WriteLine($"\"yaha\" == \"YAHA\" ? " + ("yaha" == "YAHA"));
            WriteLine($"\"yaha\".Equals(\"YAHA\") ? " + ("yaha".Equals("YAHA")));
            WriteLine($"string.Equals(\"yaha\", \"YAHA\") ? " + string.Equals("yaha", "YAHA"));
            WriteLine($"\"yaha\".Equals(\"YAHA\", StringComparison.CurrentCultureIgnoreCase) ? " + ("yaha".Equals("YAHA", StringComparison.CurrentCultureIgnoreCase)));
            WriteLine($"string.Equals(\"yaha\", \"YAHA\", StringComparison.CurrentCultureIgnoreCase) ? " + string.Equals("yaha", "YAHA", StringComparison.CurrentCultureIgnoreCase));

            WriteLine($"string.Equals(\"éèàô\", \"eeao\") ? " + string.Compare("éèàô", "eeao", StringComparison.CurrentCultureIgnoreCase));

        }
    }
}
