Низ: Разлика между версии

Изтрито е съдържание Добавено е съдържание
Quasarsz (беседа | приноси)
Редакция без резюме
Quasarsz (беседа | приноси)
Добавен C# до String Builder
Ред 90:
Още за библиотеката "stdlib.h" можете да намерите [[http://www.cplusplus.com/reference/cstdlib/]]
 
Ето пример за конкатеринаконкатерине на низове:
<source lang="c">
char* str1 = strdup("Hello"); //Друг начин за инициализиране.
Ред 131:
</source>
Още методи в класът "string" можете да намерите [[http://www.cplusplus.com/reference/string/string/]].
 
== Низове в C# ==
== Символни низове в C# ==
В C# символните низове са дефинирани в класа System.String. За декларация по време на писане на код се използва служебната дума 'string'. Тъй като string е клас, той е референтен тип данни и в стека на програмата се съхранява само указателя, сочещ към поле от динамичната памет, където се съхранява реалната стойност на обекта.
В C# символните низове са дефинирани в класа System.String. За декларация по време на писане на код се използва служебната дума 'string'. Тъй като string е клас, той е референтен тип данни и в стека на програмата се съхранява само указателя, сочещ към поле от динамичната памет, където се съхранява реалната стойност на обекта..<ref name="Въведение в C#">[http://downloads.academy.telerik.com/svn/csharppart1/Materials/Intro-CSharp-Book-1.00.pdf Въведение в C#], 465-509.</ref>
===Създаване на String===
За да работим с променлива от тип string трябва първо да я създадем и инициализираме. Трябва да се има в предвид, че създаването на референтен тип само заделя част от динамичната памет със стойност '''null'''. Ако се опитаме да извикаме инстанцирания обект, ще получим грешка за достъп до липсваща стойност '''NullReferenceException'''. Има три начина за инициализиране на променливи:<br />
:'''Задаване на литерал за символен низ.''' По този начин задаваме предефинирано текстово съдържание на променливата. Използва се когато знаем стойността, която трябва да бъде съхранена.
<big><source lang="csharp">string greeting = "Hello, World!";</source></big>
'''Присвояване на стойност от друг низ.''' При присвояване стойността на един низ на друг новата променлива приема референцията към същото място в динамичната памет, към което сочи първата.
string greeting = "Hello, World!";
</big><source lang="csharp">
:'''Присвояване на стойност от друг низ.''' При присвояване стойността на един низ на друг новата променлива приема референцията към същото място в динамичната памет, към което сочи първата.
<source lang="csharp">
string initial = "Some Text";
string assigned = initial;
</source></big>
:'''Приемане на стойност от операция, която връща string.''' ПриТова присвояванеможе стойносттада набъде единметод, низкойто валидира данни; преобразуване на друг новататип променлива; приемасъбиране референцията към същото място в динамичната памет, към коетона сочиняколко първатаниза.
<big><source lang="csharp">
string initialfirstName = "Some TextGeorgi";
string assignedlastName = initial"Georgiev";
string fullName = firstName+lastName;
</source>
 
// Georgi Georgiev
</source></big>
===Операции със символни низове===
Трябва да се отбележи, че символните низове са неизменими и всяка промяна на един низ води до създаване на нов, в който се пази резултата и пренасочване към него. Това може да силно да забави изпълнението на една програма при много редакции на един низ (например долепване на символи в цикъл). В такива случаи използваме класа [[:String Builder]] който оптимизира работата с низове.<br><br>
'''Сравняване на низове'''
:'''Сравняване за еднаквост.''' Удобен за това е метода '''Equals()''', който работи еквивалентно на ''''==''''. Метода връща булев резултат ''''true'''' при еднакви низове и ''''false'''' при различни. Трябва да се има в предвид, че по този начин се сравняват побуквено елементите на масива, като се прави разлика между главни и малки букви. Често ще ни интересува само текстовото съдържание без регистъра на буквите, затова може да използваме метода ''''Equals()'''' с параметър ''''StringComparison.CurrentCultureIgnoreCase''''
<big><source lang="csharp">
string word1 = "C#";
string word2 = "c#";
Console.WriteLine(word1.Equals("C#"));
Console.WriteLine(word1.Equals(word2));
Console.WriteLine(word1=="C#");
Console.WriteLine(word1==word2);
 
// True
// False
// True
// False
</source></big>
:'''Сравняване на низове по азбучен ред.''' За тази цел се ползва метода ''''String.CompareTo()'''', който връща отрицателна стойност, когато първият низ е лексикографски преди втория, нула при равни стойности и положителна стойност при втори преди първи низ. Отново трябва да се има в предвид, че сравнението взима под внимание регистъра на буквите като малките са преди големите. Ако искаме да сравним двата низа без да взимаме под внимание регистъра ползваме статичния метод ''''string.Compare(string strA, string strB, bool ignoreCase) ''''. Вместо булевата променлива ''''ignoreCase'''' можем да подадем ''''StringComparison.CurrentCultureIgnoreCase'''', с което метода отново ще работи.
<big><source lang="csharp">
string str1 = "sCore";
string str2 = "score";
Console.WriteLine(str1.CompareTo(str2));
Console.WriteLine(str2.CompareTo(str1));
Console.WriteLine(str1.CompareTo(str1));
Console.WriteLine(string.Compare(str1, str2 , true));
Console.WriteLine(string.Compare(str1, str2 , StringComparison.CurrentCultureIgnoreCase));
 
// 1
// -1
// 0
// 0
// 0
</source></big>
'''Долепване на низове (конкатенация)'''<br>
Долепването на символни низове става чрез операторите ''''+'''', ''''+='''' и метода ''''Concat()''''. Към всеки низ може да се добави всеки друг тип, който може да се представи под формата на низ.
<big><source lang="csharp">
string greeting = "Hello, ";
string name = "Pesho!";
string result = string.Concat(greeting, name);
result = result + " How are you?\n";
result += "It's " + DateTime.Now;
Console.WriteLine(result);
 
//Hello, Pesho! How are you?
//It's 22.8.2013 г. 7:33:31
</source></big>
'''Промяна на регистъра на символен низ''' <br>
Понякога се налага да приведем един низ в единен регистър (при записване на потребителски имена в база данни, проверка на парола и т.н.). Това става с двата метода ''''ToUpper()'''' и ''''ToLower()''''.
<big><source lang="csharp">
string text = "SoMe teXt";
Console.WriteLine(text.ToUpper());
Console.WriteLine(text.ToLower());
 
//SOME TEXT
//some text
</source></big>
'''Търсене на низ в друг низ''' <br>
За търсене в даден низ се ползват двата метода ''''IndexOf()'''' и ''''LastIndexOf()'''', като първия търси от началото на низа към края му, а втория на обртно. И двата метода връщат цяло число когато намерят индекс и ''''-1'''' ако няма намерена стойност, като регистъра на текста е от значение. Ако искаме да търсим от определена стойност, можем да подадем параметър с индекса, от който да започва търсенето.
<big><source lang="csharp">
string text = "Some text";
int indexEFirst = text.IndexOf("e");
int indexESecond = text.IndexOf("e",5);
int lastIndex = text.LastIndexOf("e");
Console.WriteLine(indexEFirst);
Console.WriteLine(indexESecond);
Console.WriteLine(lastIndex);
 
// 3
// 6
// 6
</source></big>
'''Извличане на част от низ''' <br>
За тази цел използваме метода ''''Substring()'''' с подадени параметри за начален индекс и дължина. Ако не подадем дължина на подниз се взима от дадения индекс до края на първия низ.
<big><source lang="csharp">
string text = "Some text here";
string extracted = text.Substring(5, 4);
string extractedToEnd = text.Substring(5);
Console.WriteLine(extracted);
Console.WriteLine(extractedToEnd);
 
// text
// text here
</source></big>
'''Разцепване на низ по разделител''' <br>
За да се изведат в масив елементите от списък записан в стринг се ползва метода ''''Split()'''', на който подаваме разделител или масив от разделители. Тъй като при списъците има допиране на разделители, често се получават празни полета в новосъздадения масив, затова в параметрите на метода подаваме ''''StringSplitOptions.RemoveEmptyEntries'''', който да приема два съседни разделителя за един.
<big><source lang="csharp">
string listOfNames = "Gosho, Pesho, Tosho, Ivan";
char[] separators = new char[] {' ',',','.'};
string[] Names = listOfNames.Split(separators,StringSplitOptions.RemoveEmptyEntries);
</source></big>
'''Премахване на ненужни символи от стринг''' <br>
За да премахнем празни места (нови редове, интервали и табулации) в началото и в края на един символен низ използваме метода ''''Trim()''''. При подаване на масив със символи същият метод ги търси и изтрива само тях в символния низ. Ако искаме да премахнем ненужните символи и празни места само в началото или само в края използваме съответно ''''TrimStart()'''' и ''''TrimEnd()''''
<big><source lang="csharp">
string data1 = " 111 $ % Text Example ### s ";
string data2 = " \n\n Text Example ";
char[] trimChars = new char[] { ' ', '1', '$', '%', '#', 's' };
Console.WriteLine(data2.Trim());
Console.WriteLine(data1.Trim(trimChars));
Console.WriteLine(data1.TrimEnd(trimChars));
 
// Text Example
// Text Example
// 111 $ % Text Example
</source></big>
'''Оптимизация на паметта при символни низове''' <br>
Когато инициализираме променлива от тип string с низов литерал, динамичната памет се обхожда и се прави проверка дали такава стойност вече съществува. Ако съществува, новата променлива просто се пренасочва към нея. Ако не, референцията се препраща да сочи към нов блок памет. Интернирането на низове в [[.NET_Framework|.NET]] е възможно, защото низовете по концепция са неизменими и няма опасност някой да промени областта, сочена от няколко стрингови променливи едновременно. Когато не инициализираме низовете с литерали, не се ползва интерниране. Все пак, ако искаме да използваме интерниране изрично, можем да го направим чрез метода ''''Intern()''''. За да демонстрираме това по-долу използваме статичния метод ''''Object.ReferenceEquals()'''', който проверява дали два обекта сочат към един и същ блок памет.
<big><source lang="csharp">
string declared = "Some text";
string built = new StringBuilder ("Some text").ToString();
string interned = string.Intern(built);
Console.WriteLine(object.ReferenceEquals(declared, built));
Console.WriteLine(object.ReferenceEquals(declared, interned));
 
// False
// True
</source></big>
 
===String Builder===
 
==Източници==
<references />
 
 
[[Категория:Информатика]]
[[Категория:Формални езици]]