1.Operatorul foreach
- Aceste operator serveste la asresarea ciclica la elementele colectiei, care reprezinta un grup de obiecte. In C# sunt citeva tipuri de colectii, fiecare din ele fiin masiv
- Forma generala al operatorului foreach:
foreach (tip nume_variabila_ciclu in colectia) operator;
Aici tip nume_variabila_ciclu reprezinta tipul si numele variabilei de control al ciclului, care primeste valoarea urmatorului element al colectiei la fiecare pas al executarii ciclului foreach. Iar colectia reprezinta colectia care este interogata ciclic. Prin urmare tipul variabilei ciclului trebuie sa fie la fel ca si tipul masivului. In afara de aceasta tiupul se poate de declarat cu cuvintul cheie var. In acest caz compilatorul singur determina tipul variabilei ciclului, reesind din tiupl masivului. Acest lucru poate fi folositor in lucrul cu tip determinat de interogari.
- Operatorul foreach lucreaza in modul urmator: Cind ciclul se incepe, primul element al masivului se atribuie vatiabilei ciclului. La fiecare pas al iteratiri se ia urmatorul element, care se pastreaza in variabila ciclului. Ciclul se termina cind toate elementele masivului vor fi prelucrate in asa mod. Prin urmare ciclul foreach secvential acceseaza elementele de la inceput pina la sfirsit.
- Trebuie de avut in vedere ca variabila ciclului foreach este doar pentru citire. Asta inseamna ca , atribuind acestei variabile noi valori nu putem modifica valorile din masiv.
- Mai jos prezentam un exemplu. Aici pentru inceput se creaza un masiv si se initializeaza, apoi aceste valori se afiseaza calculind suma lor.
//folosire operator foreach
using System;
namespace ForeachDemo
{
class Program
{
static void Main(string[] args)
{
int sum = 0;
int[] nums = new int[10];
//initializarea masiv nums
for (int i = 0; i < 10; i++)
nums[i] = i;
//folosire ciclu foreach pentru afisarea valorilor
//elementelor masivului si calcularea sumei lor
foreach (int x in nums) {
Console.WriteLine("valoarea elementului este: " + x);
sum += x;
}
Console.WriteLine("Suma este: " + sum);
Console.ReadKey(true);
}
}
}
Dupa cum se vede operatorul foreach prelucreaza ciclic masivul in ordinea secventiala de la primul element pina la ultimul.
- acest operator se poate de finalizat si inainte de a se termina elementele din masiv, folosind operatorul break;
- foreach se poate de folosit si la masivele bidimensionale. In acest caz elementele sunt returnate in ordinea rindurilor de la primul la ultimul.
EX:
//folosire operator foreach la accesarea unui masiv bidimensional
using System;
namespace ForeachDemo2
{
class Program
{
static void Main(string[] args)
{
int sum = 0;
int[,] nums = new int[3,5];
//initializarea masiv nums
for (int i = 0; i < 3; i++)
for (int j = 0; j < 5; j++)
nums[i,j] = (i+1)*(j+1);
//folosire ciclu foreach pentru afisarea valorilor
//elementelor masivului si calcularea sumei lor
foreach (int x in nums) {
Console.WriteLine("valoarea elementului este: " + x);
sum += x;
}
Console.WriteLine("Suma este: " + sum);
Console.ReadKey(true);
}
}
}
- Operatorul foreach permite adresare ciclica la masiv doar in ordine prestabilita: de la inceput la sfirsit, si de asta posibilitatile lui par a fi limitate.In realitate nu este asa. In multi algoritmi (ex.:de cautare) este nevoie anume de asa mecanizm.
Ex: ciclul foreach este folosit pentru a cauta in masiv o valoare anumita, cind este gasita ciclul se sfirseste:
//folosire operator foreach pentru cautare element
using System;
namespace Search
{
class Program
{
static void Main(string[] args)
{
int val;
bool found = false;
int[] nums = new int[10];
//initializarea masiv nums
for (int i = 0; i < 10; i++)
nums[i] = i;
val = 5;
//folosire ciclu foreach pentru afisarea valorilor
//elementelor masivului si calcularea sumei lor
foreach (int x in nums) {
if (x == 5) {
found = true;
break;
}
}
if(found)
Console.WriteLine("Valoarea a fost gasita!");
Console.ReadKey(true);
}
}
}
Programa afiseaza: Valoarea a fost gasita
- Operatorul foreach este ideal pentru acest fel de situatii, deoarece in cautarea elementului trbuie de analizat fiecare elemnt. Alte cazuri de folosire al operatorului foreach sunt calcularea mediei, cautarea minimului si maximului, depistarea duplicatelor.
2.Sirurile
- Din punct de vedere tipul de date string este printre celemai importante in C#. Acest tip determina sirurile de caractere. In alte limbaje de programare sirul reprezinta un masiv de caractere. In C# sirurile sunt obiecte. Prin urmare tipul string este de tip referinta.
- La crearea unui literar de tip caracter se formeaza un obiect de tip string: EX:
Console.WriteLine("In C# sirurile sunt obiecte.");
rindul de text In C# sirurile sunt obiecte automat este transformat in obiect de mediul C#.
3.Formarea sirurilor
- Cel mai simplu mod de a crea un sir de caractere - folosirea literalelor. De exemplu in urmatorul fragment de cod variabilei referinta la sirul str i se atribuie referinta la un literal
string str = "Sirurile in C# sunt foarte efective.";
In acest caz variabila str este initializata secvential cu simbolurile "Sirurile in C# sunt foarte efective."
Obiectul de tip string se poate de creat si dintr-un masiv de tip char. Exemplu:
char[ ] charray = {'t','e','s','t'};
string str = new string(charray);
Din moment ce obiectul de tip string este creat, el se poate de folosit oriunde va fi nevoie. Asa cum este aratat in exemplul de mai jos, obiectul de tip string poate si folosit in calitate de argument la apelul metodei WriteLine().
//creare si afisare sir de caractere
using System;
namespace StringDemo
{
class Program
{
static void Main(string[] args)
{
char[] charray = { 'A', 'c', 'e', 's', 't', 'a', ' ', 'E', 's', 't', 'e', ' ', 'u', 'n', ' ', 's', 'i', 'r', '.' };
string str1 = new string(charray);
string str2 = "Inca un sir.";
Console.WriteLine(str1);
Console.WriteLine(str2);
Console.ReadKey(true);
}
}
}
Rezultatul executarii acestei programe este:
Acesta Este un sir.
Inca un sir.
4.Adresarea la siruri
- Clasa de tip string contine mai multe metode de adresare la siruri. Citeva metode accepta parametrul de tip StringComarision. Acesta este un tip enumerat care determina diferite valori, care determina ordinul de comparatie intre siruri. Sirurile de caractere se pot compara in diferite moduri. De exemplu se pot compara pe baza valorilor binare ale simbolurilor, din care sunt compuse sirurile. Sirurile se mai pot compara cu luarea in considerare a diferitelor particularitati ai mediul cultural, de exemplu, in ordine lexicografica.Acesta este asa zisa comparare cu luarea in considerar a mediul cultural. In afara de asta sirurile se pot compara duipa registru. Cu toate ca exista variantele supraincarcate ale metodelor Compare(), Equals(), IndexOf() si LastIndexOf(), care asigura folosirea by default al abordarii compararii sirurilor, in acest moment se considera binevenit de a indica metoda de comparare in mod direct, pentru a evita ambiguitatile, dar si pentru a simplifica lacalizarea aplicatiei.
- Dupa regula pentru compararea sirurilor de caractere in mediul cultural se foloseste StringComparison.CurrentCulture. Daca trebuie de comparat doar in baza valorilor simbolurilor este mai bine de comparat cu ajutorul StringComparison.Ordinal, iar pentru compararea rindurilor fara a lua in considerare registrul - una din metodele: StringComparison.CurrentCultureIgnoreCase sau StringComarison.OrdinalIgnoreCase. In afara de aceasta se poate de indicat compararea fara a avea in vedere mediul cultural.
- Trebuie de atras atentia la faptul ca medoa Compare(), se declara static deoarece aceasta metoda se apeleaza dupa numele clasei ei, dar nu dupa numele exemplarului. Forma generala a functiei Compare():
rezultat = string.Compare(str1, str2, metoda);
Unde metoda reprezinta abordarea concreta la compararea sirurilor.
- Atentie merita si metodele ToUpper() si ToLower(), care transforma continutul sirului in simboluri din registrul superior si respectiv inferior. Forma lor contine parametrul CultureInfo, care este legat de clasa in care se descriu atributele mediului cultural, folosit in comparare.
- Obiectele de tip string contin proprietatea Lenght, unde se pastreaza lungimea sirului.
static int Compare(string strA, string strB, StringComparison comparisonType) |
if ( strA < strB ) returneaza valoarea negativa ; if ( strA > strB ) returneaza valoarea pozitiva ; if ( strA == strB ) returneaza zero ; metoda de comparare este stabilita in argumentul comparisonType ________________________________________ |
bool Equals(string value, StringComparison comparisonType) |
Returneaza true daca sirul apelat are aceiasi valoare ca si argumentul value metoda de comparare este stabilita in argumentul comparisonType |
int IndexOf(char value) |
Indeplineste cautarea in sirul apelat al primului simbol, determinat de argumentul value. Se foloseste metoda de cautare secventiala. returneaza indexul primului simbol care corespunde cu cel cautat si -1 daca nu este gasit |
int IndexOf(string value, StringComparison comparisonType) | efectueaza cautarea subsirului, determinat de argumentul value. returneaza indexul subsirului sau -1 daca nu este gasit |
int LastIndexOf | cautarea ultimului simbol, determinat in value |
int LastIndexOf(string value, StringComarison comparisonType) |
cautarea ultimului subsir,determinat in value |
string ToLower(CultureInfo.CurrentCulture culture) | returneaza o varianta cu litere mici,Metode de transformare se determina in argumentul culture |
string ToUpper(CultureInfo.CurrentCultureculture) | returneaza o varianta cu litere mari,Metode de transformare se determina in argumentul culture |
- Un simbol individual se extrage din sir prin intermediul indexului. EX:
string str = "Test";
Console.WriteLine(str[0]);
In acest fragment se extrage simbolul "T", care este primul in sirul "Test".Indexarea sirurilor se incepe de la zero. Indexul poate servi doar la citirea unui element, nu si la scriere.
- Pentru a verifica daca sunt egale doua siruri, se foloseste ==. Daca operatorul == se foloseste la referinte la obiect, atunci el determina daca sunt referinte la unul si acelas obiect. In mode deosebit actioneaza operatorul == la obiecte de tip string. Cind operatorul == se foloseste la referintele a doua siruri, acestea compara continutul acestor doua siruri (se poate si !=). In ambele situatii se executa compararea secventiala.
- Pentru a compara doua siruri cu luarea in consideratie a mediului cultural este metoda Equals(), unde trebuie de indicat metoda de comparare sub forma de argument StringComparison.CurrentCulture. Trebuie de avut in vedere ca metoda Compare(),serveste la compararea sirurilor, de exemplu pentru sortare.
Exemlu: citeva operatii cu siruri:
//citeva operatii cu siruri
using System;
using System.Globalization;
namespace StrOps
{
class Program
{
static void Main(string[] args)
{
string str1 = "A programa in .NET este cel mai bine in C#";
string str2 = "A programa in .NET este cel mai bine in C#";
string str3 = "Sirurile in C# sunt foarte eficiente";
string strUp, strLow;
int result, idx;
Console.WriteLine("str1: " + str1);
Console.WriteLine("Lungimea sirului str1: " + str1.Length);
//crearea variante str1 cu litere mici si litere mari
strLow = str1.ToLower(CultureInfo.CurrentCulture);
strUp = str1.ToUpper(CultureInfo.CurrentCulture);
Console.WriteLine("Varianta sirului str1, " +
"scris cu minuscule:\n " + strLow);
Console.WriteLine("Varianta sirului str1, " +
"scris cu majuscule:\n " + strUp);
Console.WriteLine();
//afisare str1 cite un simbol
Console.WriteLine("Afisare str1 cite un simbol ");
for (int i = 0; i < str1.Length; i++)
Console.Write(str1[i]);
Console.WriteLine("\n");
//comparare siruri prin
if (str1 == str2)
Console.WriteLine("str1 == str2");
else
Console.WriteLine("str1 != str2");
if (str1 == str3)
Console.WriteLine("str1 == str3");
else
Console.WriteLine("str1 != str3");
//comparare siruri cu mediul cultural
result = string.Compare(str3, str1, StringComparison.CurrentCulture);
if (result == 0)
Console.WriteLine("Sirurile str1 si str3 sunt egale");
else if (result < 0)
Console.WriteLine("Sirul str1 este mai mic decit str3");
else
Console.WriteLine("Sirul str1 este mai mare decit str3");
Console.WriteLine();
//atribuire sir nou variabilei str2
str2 = "Unu Doi Trei Unu";
//cautare subsir
idx = str2.IndexOf("Unu", StringComparison.Ordinal);
Console.WriteLine("Indexul primului subsir <Unu>: " + idx);
idx = str2.LastIndexOf("Unu", StringComparison.Ordinal);
Console.WriteLine("Indexul ultimului subsir <Unu>: " + idx);
Console.ReadKey(true);
}
}
}
Trebuie de atras atentia la faptul ca metoda Compare() este apelata in modul urmator:
result = string.Compare(str3, str1, StringComparison.CurrentCulture);
Dupa cum sa spus anterior, metoda Compare() se declara static si de asta ea este apelata dupa nume,dar nu dupa exemplarul clasei
- Cu ajutorul operatorului + se pot concatena doua siruri:
string str1 = "Unu";
string str2 = "Doi";
string str3 = "Trei";
string str4 = str1 + str2 + str3;
Variabila str4 este initializata cu sirul "UnuDoiTrei"
- Cuvintul cheie string este un pseudonim al clasei System.String, determinata in biblioteca de clase ale mediu .NET Framework. Prin urmare cimpurile si metodele, determinate de tipul string, se refera la clasa System.String, in care intra si multe alte componente.
5.Masive de siruri
- Sirurile pot fi organizate in masive EX:
//masive de siruri
using System;
namespace StringArrays
{
class Program
{
static void Main(string[] args)
{
string[] str = { "Este", "un", "simplu", "test" };
Console.WriteLine("masivul initial");
for (int i = 0; i < str.Length; i++)
Console.Write(str[i] + " ");
Console.WriteLine("\n");
//modificare sir
str[1] = "de asemenea";
str[3] = "pina la limita test!";
Console.WriteLine("masivul modificat");
for (int i = 0; i < str.Length; i++)
Console.Write(str[i] + " ");
Console.ReadKey(true);
}
}
}
Rezultatul programei:
masivul initial
Este un simplu test
masivul modificat
Este de asemenea simplu pina la limita test!
- Un alt exemplu NUmerele intregi se afiseaza ca simbopluri. De exemplu cofra 19 se afiseaza "unu noua"
//afisare cifre in forma de simboluri
using System;
namespace ConvertDigitsToWords
{
class Program
{
static void Main(string[] args)
{
int num;
int nextdigit;
int numdigits;
int[] n = new int[20];
string[] digits = { "zero", "unu", "doi",
"trei", "patru", "cinci",
"sase", "sapte", "opt",
"noua" };
num = 1908;
Console.WriteLine("Numarul: " + num);
Console.Write("numarul in cuvinte: ");
nextdigit = 0;
numdigits = 0;
//obtine cifre si salvare in masivul n
//aceste cifre se pastreaza in ordine inversa
do{
nextdigit = num % 10;
n[numdigits] = nextdigit;
numdigits++;
num = num / 10;
}while(num > 0);
numdigits--;
//afisare cuvinte obtinute
for (; numdigits >= 0; numdigits--)
Console.Write(digits[n[numdigits]] + " ");
Console.WriteLine();
Console.ReadKey(true);
}
}
}
Rezultatul programei:
Numarul: 1908
numarul in cuvinte: unu noua zero opt
In aceasta programa se foloseste masivul de siruri digits pentru a pastra cifrele scrie cu litere. In urma executarii programei cifrele intregi se transforma in cuvinte. Pentru asta mai intii se obtin cifrele separat, apoi se pastreaza in ordine inversa in masivul n de tip int. Dupa asta se efectuiaza cererea ciclica al masivului n in ordine inversa. Fiecare valoare intreaga din masivul n serveste ca index, care indica la cuvintul, care corespunde cifrei obtinute.
5.Constanta sirurilor
- Continutul obiectului de tip string nu poate fi modificat. Acest lucru inseamna ca odata ce a fost creat, sirul nu poate fi modificat. Daca este nevoie de modificat, cream alt sir cu modificarile necesare.
- Variabilele referinte la siruri pot fi modificate, ele se pot referi la alte obiect. Dar continutul obiectului de tip string nu se poate modifica dupa crarea sa.
- Pentru a demostra ca acest lucru nu sunt o piedica ne vom folosi de o metoda de lucru cu sirurile Substring(); Aceasta metoda returneaza un nou sir, care contine o parte din sirul apelat. In rezultat se creaza un obiect nou care contine subsirul respectiv. Forma generala a metodei Substring():
string Substring (int indexul_de_inceput, int lungimea);
- Prezentam o programa care demosntreaza principiul constantei sirurilor:
//folosire metoda Substring();
using System;
namespace SubStr
{
class Program
{
static void Main(string[] args)
{
string orgbstr = "In C# este usor de lucrat cu sirurile";
//formare subsir
string substr = orgbstr.Substring(5, 20);
Console.WriteLine("orgstr: " + orgbstr);
Console.WriteLine("substr: " + substr);
Console.ReadKey(true);
}
}
}
Rezultatul executarii programei:
orgstr: In C# este usor de lucrat cu sirurile
substr: este usor de lucrat
Dupa cum se observa sirul initial orgbst nu se modifica, iar portiunea aleasa se afla in sirul substr
- Totusi pentru a modifica sirurile exista clasa StringBuilder, determinata in spatiul de nume System.Text. Aceasta clasa permite crearea sirurilor care pot fi modificate. Dar de regula in C# se foloseste tipul string, nu clasa StringBuilder.
6.Folosirea sirurilor in operatorul swith
- Obiectele de tip string se pot folosi pentru controlul operatorului swith
- Acesta este singurul tip neintreg de date care poate fi folosit in operatorul swith.
- Datorita acestui fapt uneori se simplifica programa. De exemplu in programa de mai jos se afiseaza separat cifrele, corespunzatoare cuvintelor "unu", "doi", "trei"
//folosire siruri in swith
using System;
namespace StringSwitch
{
class Program
{
static void Main(string[] args)
{
string[] strs = { "unu", "doi", "trei", "doi", "unu", };
foreach (string s in strs) {
switch (s) {
case "unu":
Console.Write(1);
break;
case "doi":
Console.Write(2);
break;
case "trei":
Console.Write(3);
break;
}
}
Console.WriteLine();
Console.ReadKey(true);
}
}
}
Rezultatul executarii programei: 12321