string is a data type
System.String class
Sequence of characters (Unicode symbols)
0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|
H | e | l | l | o |
0x12345 | 0x12346 | 0x12347 | 0x12348 | 0x12349 |
Index |
---|
Variable |
Address |
string text = "Hello";
Strings use Unicode to support multiple languages and alphabets
String objects are immutable: they cannot be changed after they have been created.
All the methods and operators actually return new object
string text = "Hello, Telerik Academy";
Console.WriteLine(text[0]);
// Compilation error indexer 'string.this[int]'
// cannot be assigned to -- it is read only
text[0] = 'A';
string text = "Hello";
// This is a completely new object
text += ", Telerik Academy!";
Console.WriteLine(text); // Hello, Telerik Academy!
String objects have similarities to arrays but they are NOT arrays
It is like array of characters
Fixed Length ( str.Length)
Indexers ( str[0], str[1], ... str[str.Length-1] )
You can iterate them with for and foreach loops
string text = "Telerik Academy";
string text1 = "telerik academy";
Console.WriteLine(text == text1); // False
Equality compare with == operator
case-sensitive comparison
string text = "Telerik Academy";
string text1 = "Telerik Academy";
Console.WriteLine(text == text1); // True
Equality compare with Equals() method
the same as == in C# (ex: in Java this is not true)
you can control if it is case-sensitive/insensitive
with the second parameter StringComparison enum
string a = "Telerik Academy";
string a1 = "telerik academy";
// False
Console.WriteLine(a.Equals(a1));
// True
Console.WriteLine(a.Equals(a1, StringComparison.CurrentCultureIgnoreCase));
Concatenation of strings could be done with +/+= operators
string text = "Telerik Academy";
string text1 = "Alpha";
string newText = text + " " + text1;
Or with Concat() method
string text = "Telerik Academy";
string text1 = "Alpha";
string space = " ";
string newText = string.Concat(text, space, text1, space, "Rocks!");
// Telerik Academy Alpha Rocks!
When you need to find a character in a string
IndexOf() method
returns the position of the element
or negative number if not found
case-sensitive but could be changed
string text = "Telerik Academy";
Console.WriteLine(text.IndexOf('T')); // 0
Console.WriteLine(text.IndexOf('t')); // -1
IndexOf() has many useful overloads
with different parameters
startIndex, count comparisonType, etc.
string text = "Telerik Academy";
text.IndexOf('t'); // -1
text.IndexOf("te", StringComparison.CurrentCultureIgnoreCase); // 0
In addition to IndexOf() there are other useful methods for searching
LastIndexOf()
IndexOfAny()
LastIndexOfAny()
string text = "Telerik Academy";
Console.WriteLine(text.IndexOf('e')); // 1
Console.WriteLine(text.LastIndexOf('e')); // 12
You can get part of the string with optional start and end position
string text = "Telerik Academy";
Console.WriteLine(text.Substring(8)); // Academy
Console.WriteLine(text.Substring(0, 7)); // Telerik
You can all the parts of the string as array by delimiter (",", ".", " " or any symbol you need)
string text = "Telerik Academy";
string[] arr = text.Split(' ');
Console.WriteLine(arr.Length); // 2
There could be empty string when splitting
string text = "Telerik Academy ";
// ["Telerik", "Academy", ""] empty string at the end
string[] arr = text.Split(' ');
Console.WriteLine(arr.Length); // 3
How to handle empty strings (StringSplitOptions.RemoveEmptyEntries)
string text = "Telerik Academy ";
// you should pass array of chars or strings
var splitSymbols = new char[] { ' ', ',' };
// ["Telerik", "Academy"]
string[] arr = text.Split(splitSymbols, StringSplitOptions.RemoveEmptyEntries);
Console.WriteLine(arr.Length); // 2
You can replace all occurrences of a char/string in another string with new value
Replace() method
string text = "Telerik Academy";
// Replace returns new string (strings are immutable)
var newString = text.Replace("Telerik", "Alpha");
Console.WriteLine(newString); // Alpha Academy
You can remove part of a string
Remove() method
startIndex
count (optional)
string text = "Telerik Academy";
// Remove returns new string (strings are immutable)
var newString = text.Remove(0, 8);
Console.WriteLine(newString); // Academy
You can change character casing
ToUpper()
ToLower()
etc.
string text = "Telerik Academy";
// ToUpper returns new string (strings are immutable)
var newString = text.ToUpper();
Console.WriteLine(newString); // TELERIK ACADEMY
You can trim the string (any character) from start/end
Trim() - trims start and end from whitespace
TrimEnd() - only the end
TrimStart() - only the start
all the methods could contain different symbols to trim
string text = " Telerik Academy!";
// The methods could be chained
var newString = text.Trim().TrimEnd('!');
Console.WriteLine(newString);
Mutate the string
Performing multiple concatenations (ex: in for loop) is a slow operation due to the immutability if the strings
Every time you add a string to an existing one, there is a new object created and all the previous values are copied in it
It is slow if you want to add multiple times or build a long string
If you just make a single concatenation it is okay to use simple string concatenation
StringBuilder sBuilder = new StringBuilder();
sBuilder.Append("Telerik");
sBuilder.Append(" Academy");
T | e | l | e | r | i | k | A | c |
---|
a | d | e | m | y |
---|
StringBuilder uses internal array and this makes it faster
In the new versions of .NET (>= 4.0) StringBuilder uses Linked List of StringBuilder instances
Adding is much faster
If you need to add many strings or build a large string (ex: in a for loop) you must use StringBuilder
int count = 10000;
string str = string.Empty;
StringBuilder strBuilder = new StringBuilder();
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < count; i++)
{
str += i;
}
Console.WriteLine($"String concatenate: {sw.ElapsedMilliseconds}"); // ~ 12500 ms
sw.Start();
for (int i = 0; i < count; i++)
{
strBuilder.Append(i);
}
Console.WriteLine($"StringBuilder append: {sw.ElapsedMilliseconds}"); // ~ 10 ms
Strings are immutable
Cannot be rewritten
All the operations over strings return new string (object)
Therefore they are relatively slow
All the objects in C# have ToString() method
If you need to add many chars/strings and make multiple such operations
Consider using StringBuilder