Строки. Обзор.

Строка - это список (или последовательность) символов, расположенных в определенном порядке. Вся последовательность символов рассматривается как единый объект.

Символом является все, что вы можете набрать на клавиатуре в одно нажатие клавиши (буква, цифра, обратная косая черта или другой какой-либо символ).
Строки могут иметь пробелы: "Привет, мир!".
Пустая строка является строкой, которая имеет 0 символов.
C sharp признает в качестве строк все, что записано в кавычках (""), строка относится к типу string.

Важно запомнить: строки в C# неизменяемы.

Записать новое значение в строку можно с помощью оператора ввода:
string s = Console.ReadLine();
Также можно просто присвоить переменной какое-либо строковое значение, например:
string s = "C sharp";
Можно определить длину строку так:
int n = s.Length;


Сравнение строк.

Строки можно сравнивать между собой так же, как и числа. Можно определить, какая из строк больше, какая - меньше.

При сравнении строк сравниваются коды символов. Существуют десятки, если не сотни, кодировок символов. Понять эту концепцию легче всего, разобрав одну из самых простых, ASCII (почитать про нее можно здесь). 
Необходимо понять, что в современных кодировках и русские, и английские буквы расположены в алфавитном порядке, цифры также идут от меньшей к большей. 
Например, в таблице ASCII-кодов код английской буквы 'A' - 65, буквы 'a' - 97, цифра '0' имеет код 48. Русские буквы расположены в расширенной части таблицы ASCII-кодов (номера с 128 по 255). Заглавные буквы стоят раньше (то есть имеют код меньше), чем строчные.
В большинстве используемых кодировочных таблицах закономерности такие же, строчные буквы стоят позже заглавных, цифры раньше букв, а русские буквы позже английских.
При сравнении символов или строк, C# конвертирует символы в их соответствующие порядковые значения, после чего сравнивает слева направо. 

Например: "паровоз" < "пароход", потому что слова различаются в пятой букве и "в" < "х".

При вводе строки можно сразу же разделять ее на части по какому-либо разделителю.
Так мы уже делали, когда вводили несколько числовых переменных в одной строке. Для разделения строки на части мы использовали метод Split(). По умолчанию он разделяет строки на подстроки по пробелу.
Используя такой способ, можно разделить строку на части, например, по пробелам. И каждую часть строки записать в отдельную переменную.
Пример:
string[] S = Console.ReadLine().Split();
В примере, при вводе двух слов через пробел, первое слово сохраняется в нулевом элементе массива s[0], второе - во втором s[1].

Если надо несколько символов использовать в качестве разделителей, то можно через запятую их указать:
 
 string[] S = Console.ReadLine().Split(new[] { ' ', '\n'  });
 Если во входной строке может быть несколько подряд идущих пробелов, то в итоговый массиве тоже могут попасть пробелы, чтобы этого исключить надо добавить параметр:
string[] S = Console.ReadLine().Split(new[] { ' ', '\n'  }, StringSplitOptions.RemoveEmptyEntries);
Если надо использовать разделителями подстроки:
string[] S = Console.ReadLine().Split(new[] { "\\r\\n", "\r", "\n", " " }, StringSplitOptions.RemoveEmptyEntries);

Строки можно складывать, для этого используется знак "+". Эту операцию называют сцеплением строк или конкатенацией
Например, 
string s = "Привет, ";
string s1 = "мир";
Console.WriteLine(s + s1);
На экране появится фраза "Привет, мир" (без кавычек).
 

Каждый символ строки имеет свой номер (называется индексом), причем нумерация во многих языках всегда начинается с нуля.

Например, 
Строка s H e l l o
Индекс s[0] s[1] s[2] s[3] s[4]

Обращение к элементам в строке похоже работу с элементами массива, с той лишь разницей, что строки неизменяемы.

Важно понимать: при обращении к элементу строки по индексу i тип s[i] не string, а char. Это значит, что это не строка, а символ, которому соответствует какое-то целое число в таблице кодов символов. В частности, при складывании двух элементов типа char вы получитсе целое число - сложение кодов этих элементов. При этом, если вы выведите на экран s[i], то выведится i-тый символ строки, а не число, соответствующее ему.

Поскольку к символу можно обращаться по индексу, для перебора всех символов можно использовать цикл по переменной, которая будет принимать возможные значения индексов. Например, программа, которая выводит на экран все коды символов строки s будет выглядеть так:
for (int i = 0; i < s.Length; i++)
{ 
    Console.WriteLine(s[i]);
    Console.WriteLine(Convert.ToInt32(s[i]));
}

Пояснения к программе:
1) s.Length находит длину строки. Индекс первого символа равен 0, а индекс последнего s.Length-1. Переменная цикла i как раз и будет принимать последовательно значения от 0 до 
s.Length-1;
2) в каждой строке сначала будет выводиться сам символ, а затем его код, который можно получить через метод Convert.ToInt32();

Такой же перебор можно записать короче:


foreach (char c in s)
{  
    Console.WriteLine(c);
    Console.WriteLine(Convert.ToInt32(c));
}

В данном фрагменте заголовок цикла перебирает все символы s, помещая их по очереди в переменную c.
Особенность C# при работе со строками заключается в том, что строки - это неизменяемые объекты. Другими словами, мы не можем изменять отдельные символы строки.
Например, не сработает следующий оператор:
s[5]=" ";