Risipa de key_press | Programare

Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

Risipa de key_press | Programare - Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

Metodele Enumerable – partea 1-a

In versiunea 3.5, Microsoft a introdus cateva facilitati interesante in .Net framework. Enumerable este una dintre ele. In aceasta clasa sunt definite metode care permit interogarea obiectelor care implementeaza IEnumerable.

Imi propun sa descriu cat mai multe dintre aceste metode, pe scurt, dand si exemple de folosire.

Voi lucra pe un array de string, cu ajuorul caruia voi demonstra utilizarea unor metode implementate in Enumerable.

Codul demo este urmatorul:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml.Linq;

namespace SimpleLinq_01
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] firstnames = { "Scott", "Steve", "Ken", "Joe", "John",
                        "Alex", "Chuck", "Sarah", "Oz", "Abracham"};
            string s = "";

            Array.Sort(firstnames, (string x, string y) => x.Length.CompareTo(y.Length));
            Array.ForEach<string>(firstnames, (string a) => Console.WriteLine(a));
            Console.WriteLine();
            
            Array.ForEach<string>(firstnames, (string a) => s += a + " ");
            Console.WriteLine(s);
            Console.WriteLine();
            
            //sorteaza array-ul in functie de ultima litera (da erroare daca exista string.empty in lista).
            Array.Sort<string>(firstnames, (string x, string y) => { return x[x.Length - 1].CompareTo(y[y.Length - 1]); });
            Array.ForEach<string>(firstnames, (string a) => Console.WriteLine(a));
            Console.WriteLine();


            // va construi un string compus din elementele firstnames separate de virgula
            s =firstnames.Aggregate<string>((string x, string y) => { return x + "," + y; });
            Console.WriteLine(s);
            // va construi un string compus din elementele firstnames 
            // separate de virgula, luate in ordine inversa
            s = firstnames.Aggregate<string>((string x, string y) => { return y + "," + x; });
            Console.WriteLine(s);
            Console.WriteLine();

            bool ok = firstnames.All<string>((string x) => { return x.Length > 2; });
            Console.WriteLine("{0}", ok ? "All ok" : "Some are not ok");
            Console.WriteLine();

            ok = firstnames.Any<string>((string x) => { return x.Length > 4; });
            Console.WriteLine("{0}", ok ? "At least one element is ok." : "None is ok.");
            Console.WriteLine();

            //media lungimilor cuvintelor din lista
            double average = firstnames.Average(x => x.Length);
            Console.WriteLine("Average length {0}", average);
            //media sumei valori ascii a literelor componente
            average = firstnames.Average(x => {
                //int count = 0;
                //for (int i = 0; i < x.Length; i++)
                //    count += (int)x[i];
                //return count;
                return x.ToCharArray().Sum(y => (int)y);  //mai simplu decat codul comentat
            });
            Console.WriteLine("Average weight {0}", average);

            

            int count = firstnames.Count(x => x.Length > 4);
            Console.WriteLine("Names with min 5 letters: {0}", count);
            Console.WriteLine();

            string firstW = firstnames.First(x => x.Length > 3);
            Console.WriteLine("First name with 4 letters is {0}", firstW);
            Console.WriteLine();

            

            Console.ReadKey();
        }
    }
}

care are ca rezultat al executiei:

Oz
Joe
Ken
Alex
John
Sarah
Chuck
Steve
Scott
Abracham

Oz Joe Ken Alex John Sarah Chuck Steve Scott Abracham

Joe
Steve
Sarah
Chuck
Abracham
Ken
John
Scott
Alex
Oz

Joe,Steve,Sarah,Chuck,Abracham,Ken,John,Scott,Alex,Oz
Oz,Alex,Scott,John,Ken,Abracham,Chuck,Sarah,Steve,Joe

Some are not ok

At least one element is ok.

Average length 4.4
Average weight 438.2
Names with min 5 letters: 5

First name with 4 letters is Steve

Voi lua, pe rand, bucati de cod pentru explicatii suplimentare:

            Array.Sort(firstnames, (string x, string y) => x.Length.CompareTo(y.Length));
            Array.ForEach<string>(firstnames, (string a) => Console.WriteLine(a));
            Console.WriteLine();

O metoda mai scurta de a sorta un array, scriind, inline, regula de comparare intre doua elemente. In linia urmatoare este afisat fiecare element al array-ului – forma de scriere mult mai scurta decat daca s-ar folosi un ciclu for sau foreach.

            Array.ForEach<string>(firstnames, (string a) => s += a + " ");
            Console.WriteLine(s);

se poate citi: adaoga fiecare element (a) din array plus un spatiu la string-ul s.

            //sorteaza array-ul in functie de ultima litera (da erroare daca exista string.empty in lista).
            Array.Sort<string>(firstnames, (string x, string y) => { return x[x.Length - 1].CompareTo(y[y.Length - 1]); });
            Array.ForEach<string>(firstnames, (string a) => Console.WriteLine(a));
            Console.WriteLine();

O alta regula de sortare, in functie de ultima litera a cuvantului.

            // va construi un string compus din elementele firstnames separate de virgula
            s =firstnames.Aggregate<string>((string x, string y) => { return x + "," + y; });
            Console.WriteLine(s);
            // va construi un string compus din elementele firstnames 
            // separate de virgula, luate in ordine inversa
            s = firstnames.Aggregate<string>((string x, string y) => { return y + "," + x; });
            Console.WriteLine(s);
            Console.WriteLine();

Aggregate este o metoda care lipeste elementele array-ului dat folosind regula definita de noi. In cazul dat, regula este primul element + “, ” + elementul al doilea.
Ulterior am schimbat regula pentru a face aceeasi operatie, insa in sens invers, pornind de la ultimul element spre primul.

            bool ok = firstnames.All<string>((string x) => { return x.Length > 2; });
            Console.WriteLine("{0}", ok ? "All ok" : "Some are not ok");
            Console.WriteLine();

O metoda de a verifica daca toate elementele unui array respecta o anumita regula.

sau…

            ok = firstnames.Any<string>((string x) => { return x.Length > 4; });
            Console.WriteLine("{0}", ok ? "At least one element is ok." : "None is ok.");
            Console.WriteLine();

daca exista cel putin un element care respecta regula data.

            //media lungimilor cuvintelor din lista
            double average = firstnames.Average(x => x.Length);
            Console.WriteLine("Average length {0}", average);
            //media sumei valori ascii a literelor componente
            average = firstnames.Average(x => {
                //int count = 0;
                //for (int i = 0; i < x.Length; i++)
                //    count += (int)x[i];
                //return count;
                return x.ToCharArray().Sum(y => (int)y);  //mai simplu decat codul comentat
            });
            Console.WriteLine("Average weight {0}", average);

Se stabileste o regula de calculare a mediei care se aplica pentru elementele array-ului.

            int count = firstnames.Count(x => x.Length > 4);
            Console.WriteLine("Names with min 5 letters: {0}", count);
            Console.WriteLine();

Sunt numarate elementele care respecta o anumita regula.

            string firstW = firstnames.First(x => x.Length > 3);
            Console.WriteLine("First name with 4 letters is {0}", firstW);
            Console.WriteLine();

Este returnat primul element care indeplineste o anumita regula.

Intr-un articol viitor voi continua aceasta lista.

Category: Uncategorized

Your email address will not be published. Required fields are marked *

*