Cartea este proiectat pentru o gamă largă de cititorii interesați de programare în C # .Vvedite scurt rezumat aici
Book: C # 4.0: Un ghid complet
metode de anchetă
Secțiunile de pe această pagină:
sintaxă interogare descrisă în secțiunile anterioare, este utilizat în formarea majorității interogările în C #. Este convenabil, eficient și compact, deși nu singurul mod de a interoga. O altă metodă este de a utiliza tehnici de interogare. care pot fi cauzate de orice obiect enumerare astfel matrice.
interogare metode de bază
metode de interogare sunt definite în clasă și System.Linq.Enumerable implementate ca metode de extindere a funcțiilor de forme generalizate de interfață IEnumerable
Clasa enumerable oferă o mulțime de metode de interogare, dar metodele de bază sunt cele care se potrivesc cu interogarea descrisă mai sus operatori. Aceste metode sunt enumerate mai jos, împreună cu operatorii respectivi de interogare. Cu toate acestea, trebuie să se țină seama de faptul că aceste metode, de asemenea, au supraîncărcat forme, dar aici ele sunt reprezentate doar în cele mai simple în formă. Dar aceasta forma lor este folosit cel mai des.
Metoda de solicitare operator de interogare echivalentă
selectați Selectare (Selector)
unde unde (predicat)
orderby orderby (keySelector) sau
OrderByDescending (keySelector)
Alăturați-vă alătura (interior, outerKeySelector,
innerKeySelector, resultSelector)
grupă GroupBy (keySelector)
Cu excepția Join () metoda. alte metode de cerere să ia un singur argument care este un obiect al unor specii de tip generic de func
delegat TResult Func
unde denota TResult tip rezultat, ceea ce permite delegatului, și T - element de tip. În metodele de interogare de selectare argumente. keySelector predicat sau pentru a determina o acțiune care ia metoda de interogare. De exemplu, în metoda de unde () argument predicat definește procedura de selecție a datelor din cerere. Fiecare metodă de interogare returnează un obiect enumerable. Prin urmare, rezultatul unei metode de interogare poate fi folosită pentru a apela un alt, conectarea acestor metode în lanț.
Alăturați-vă () metoda are patru argumente. Secvența Primul argument (interior) este o referire la a doua au fost combinate este o primă secvență pentru care este cauzat Join metoda (). Tasta de selectare pentru prima secvență este trecut ca un argument outerKeySelector, un selector cu cheie pentru a doua secvență - ca argument innerKeySelector. Rezultatul combinării resultSelector desemnat ca argument. outerKeySelector argument este de tipul de func
Metoda de solicitare Argumentul este o metodă care este compatibilă cu forma indică funs delegat. dar el nu trebuie să fie în mod explicit declară metode. De fapt, folosit în loc de multe ori expresia lambda. Așa cum sa explicat în capitolul 15 lambda oferă o modalitate simplă, dar eficientă de determinare, care în esență este metoda anonimă și C # compilator convertește automat expresia lambda la o formă care poate fi transmisă ca un parametru funs delegat. Datorită faptului că expresii lambda oferă o modalitate simplă și eficientă de programare, acestea sunt utilizate în toate exemplele prezentate mai târziu în această secțiune.
cereri de formare folosind metode de cerere
Folosind tehnici de interogare simultan cu expresii lambda pot genera interogări, în general, fără a utiliza sintaxa stipulate în C # pentru interogări. În schimb, apelați metodele de solicitare corespunzătoare. Referindu-ne mai întâi la un exemplu simplu. Este o variantă a primului exemplu al programului din această secțiune, convertit pentru a demonstra aplicarea În cazul în care cererea () și selectați () în locul operatorilor corespunzători.
// Utilizați metodele de interogare pentru formarea unei interogări simple.
// Aceasta este o versiune Reproiectat a primului program de probă din acest capitol.
folosind System;
folosind System.Linq;
clasa SimpQuery
static void Main ()
int [] Nums = <1, -2, 3, 0, -4, 5>;
// Utilizați metodele de unde () și Select () pentru a
// formarea unei interogări simple.
posNums var = nums.Where (n => n> 0); selectați (r => r);
Console.Write ( "Valorile pozitive ale Nums array:");
// executa interogarea și a afișa rezultatele,
foreach (int i în posNums) Console.Write (i + "");
Console.WriteLine ();
>
>
Această versiune are același efect ca și originalul.
Valorile pozitive ale Nums matrice: 1 3 5
Acordați o atenție specială în acest program la următoarea linie de cod.
posNums var = nums.Where (n => n> 0); selectați (r => r);
În această linie de cod este generat de interogare care este stocată într-un posNums variabilă. Această solicitare, la rândul său, este format dintr-o secvență de valori pozitive, preluate de la un Nums matrice. În acest scop, În cazul în care () metoda. selectarea valorii solicitate, și metoda Select (). formarea selectivă a valorilor finale rezultate. În cazul în care (), metoda poate fi numit la Nums matrice. deoarece toate matricele pune în aplicare interfață IEnumerable
Formal Selectați () metoda în exemplul nu este necesară, deoarece este o interogare simplă. După secvență returnat de unde (). conține deja rezultatul final. Dar alegerea finală poate fi făcută pentru criterii mai complexe, așa cum sa arătat anterior în exemplele de utilizare sintaxă interogare. Astfel, în conformitate cu următoarea solicitare din valoarea pozitivă Nums matrice din spate, a crescut cu un ordin de mărime.
posNums var = nums.Where (n => n> 0); selectați (r => r * 10);
Așa cum s-ar putea fi de așteptat, în lanțul pot fi combinate, precum și alte operațiuni privind datele obținute la cerere. De exemplu, următoarea interogare selectează valori pozitive, care sunt apoi sortate după descendent și revenirea la o secvență rezultantă:
posNums var = nums.Where (n => n> 0) .OrderByDescending (j => j);
unde j expresie => j denotă că depinde de parametrul de intrare ordonarea, care este un element al secvenței de date obținute din metoda Unde ().
Următorul exemplu demonstrează aplicație metoda solicitare GroupBy (). Această versiune modificată a exemplului prezentat mai devreme.
// Să demonstreze metoda solicitării de utilizare GroupBy ().
// Aceasta este o versiune revizuită a exemplului prezentat anterior
// pentru a arăta sintaxa de interogare.
folosind System;
folosind System.Linq;
clasa GroupByDemo
static void Main ()
string [] site-uri =
"HsNameA.com", "hsNameB.net", "hsNameC.net",
"HsNameD.com", "hsNameE.org", "hsNameF.org",
"HsNameG.tv", "hsNameH.net", "hsNamel.tv"
>;
// Utilizați metodele de interogare pentru a grupa
// numele site-ul Web al domeniului de nivel superior.
var webAddrs = websites.Where (w => w.LastIndexOf ( '')! = 1).
GroupBy (x => x.Substring (x.LastIndexOf (, x.Length)) "");
// Efectuați rezultate de interogare și pentru a le aduce, foreach (site-uri de var în webAddrs)
foreach (situri de var în webAddrs)
Console.WriteLine ( "site-uri web grupate" +
"Nume de domeniu" + sites.Key);
foreach (site-var în situri)
Console.WriteLine ( "" + site-ul);
Console.WriteLine ();
>
>
>
Această versiune a programului dă același rezultat ca și cel anterior. Singura diferență dintre ele este modul în care este generat cererea. În această versiune, în acest scop, solicita metode.
Luați în considerare un alt exemplu. Dar mai întâi să ne încă o dată cere din aplicarea exemplul prezentat anterior se alăture operatorului.
inStockList var = de la element în articole
se alăture la intrarea în statusList
pe item.ItemNumber este egal cu entry.ItemNumber
selectați noua Temp (item.Name, entry.InStock);
Această solicitare este generată secvență constând din obiecte care încapsulează numele produsului și starea stocurilor sale în depozit. Toate aceste informații sunt obținute prin combinarea celor două surse de date: articole si statusList. Mai jos este o versiune convertită a cererii, în care, în loc de sintaxa prevăzută în C # pentru interogări, se utilizează JOIN () metoda de solicitare.
// Utilizați JOIN () metoda cererii de lista
// numele produselor și starea stocurilor lor în depozit,
var inStockList = items.Join (statusList,
kl => kl.ItemNumber,
k2 => k2.ItemNumber,
(Kl, k2) => new Temp (kl.Name, k2.InStock));
În această realizare, clasa Temp numit este utilizat pentru a stoca obiectul rezultante, dar în schimb se poate utiliza tipul anonim. O astfel de formular de cerere este prezentată mai jos.
Sintaxa pentru interogări și metode de interogare
Așa cum sa explicat în secțiunea precedentă, interogări în C # poate fi format în două moduri, folosind sintaxa interogare sau interogare metode. Este interesant faptul că ambele metode sunt asociate unele cu altele mai îndeaproape decât pare, uita la codul sursă. Faptul că sintaxa de interogare este compilat într-o metode de solicitare de apel. Prin urmare, codul
Acesta va fi transformat de compilator la următoarea provocare.
Astfel, atât procesul de formare a interogările în cele din urmă converg spre același.
Dar dacă ambele metode sunt în cele din urmă echivalente, atunci care este mai bine pentru programare în C #? În general, se recomandă utilizarea mai sintaxei de interogare, deoarece este complet integrat în limbajul C #, susținută de cuvinte cheie și sintaxa relevante.
Alte metode de interogări legate de expansiune
În plus față de metodele care sunt operatorii de interogare adecvate susținute de C #, având etsya o serie de alte metode de extindere, asociate cu cererea, și de multe ori ajutând la crearea unor interogări. Aceste metode sunt disponibile în .NET Framework și sunt definite pentru interfața IEnumerable
metoda Descriere
Toate (predicat) Returnează o valoare booleană adevărat,
în cazul în care toate elementele din secvența
îndeplinește condiția privind
predicat
Orice (predicat) Returnează o valoare booleană adevărat, în cazul în care
fiecare element satisface secventa
set Stare parametrompredicate
Mediu () Returnează media tuturor valorilor numerice în
secvență
Conține (valoare) returnează o valoare booleană adevărat, dacă
secvență conținută în obiect menționat
Count () returnează lungimea secvenței, adică,
numărul elementelor sale constitutive
Primul () Returnează primul element din secvența
Ultimul () Returnează ultimul element din secvența
Max () Returnează valoarea maximă
secvență
Min () returnează valoarea minimă
secvență
Suma () Returnează suma valorilor numerice
secvență
Count () metoda deja demonstrată anterior în acest capitol. Un program Următoarele demonstrează celelalte metode de extindere, asociate cu cererile.
// Utilizați o serie de metode de extensie definite în clasa enumerable.
folosind System;
folosind System.Linq;
ExtMethods clasa
static void Main ()
int [] Nums = <3, 1, 2, 5, 4>;
Console.WriteLine ( "valoare minimă este" + nums.Min ());
Console.WriteLine ( "valoare maximă este" + nums.Max ());
Console.WriteLine ( "Prima valoare este" + nums.First ());
Console.WriteLine ( "Ultima valoare este" + nums.Last ());
Console.WriteLine ( "Valoarea totală este" + nums.Sum ());
Console.WriteLine ( "Valoarea medie este" + nums.Average ());
if (nums.All (n => n> 0))
Console.WriteLine ( "Toate valorile mai mari decât zero.");
if (nums.Any (n => (n% 2) == 0))
Console.WriteLine ( „Cel puțin o valoare este un număr par.“);
if (nums.Contains (3))
Console.WriteLine ( „3. Matricea conține valoarea“);
>
>
Asta este ceea ce rezultatele în punerea în aplicare a acestui program.
Valoarea minimă este de 1
Valoarea maximă este de 5
Prima valoare este egală cu 3
Această din urmă valoare este egală cu 4
Valoarea totală este egală cu 15
Valoarea medie este egală cu 3
Toate valorile mai mari decât zero.
Cel puțin o valoare este chiar
Matricea conține valoarea 3.
Metodele de extensie sunt asociate cu interogări, puteți fi, de asemenea, utilizat în interogare bazată pe sintaxa interogare de căutare furnizate în C #. Și, de fapt, acest lucru se face foarte des. De exemplu, mediu (), metoda este utilizată în următorul program pentru a obține o secvență care constă numai din acele valori care sunt mai mici decât media tuturor valorilor din matrice.
Când executați acest program produce următoarea ieșire.
Valoarea medie este de 5,6
Valori mai mici decât media 1 2 3 4
Acordați o atenție specială în acest program cu următoarea solicitare de cod.
După cum puteți vedea, variabila x într-o declarație lit. i se atribuie media tuturor valorilor din Nums matrice. Această valoare este obținută prin apelarea medie metoda () pentru o Nums matrice.