Exemplo de uso de LINQ no C#

Texto introdutório retirado do site da Microsoft.

Uma consulta é uma expressão que recupera dados de uma fonte de dados e normalmente são expressas em uma linguagem de consulta especializada.
Diferentes linguagens foram desenvolvidas ao longo do tempo para os diversos tipos de fontes de dados, por exemplo, SQL para bancos de dados relacionais e o XQuery para XML.
Portanto, os desenvolvedores precisaram aprender uma nova linguagem de consulta para cada tipo de fonte de dados ou formato de dados que eles tinham que oferecer suporte.

O LINQ simplifica essa situação ao oferecer um modelo consistente para trabalhar com os dados entre vários tipos de fontes e formatos de dados.
Em uma consulta LINQ, você está sempre trabalhando com objetos, que é algo de conhecimento do desenvolvedor.

Exemplos de código e usabilidade

Este exemplo foi retirado e alterado do curso de Jump Start C# da MVA e todos os direitos pertencem a eles. Apenas deixei o código mais fácil para ser lido

using System;
using System.Collections.Generic;
using System.Linq;

namespace UsingLinq
{
    public class Program
    {
        public static void Main(string[] args)
        {
			var samplesLinq = new SamplesLinq();
			samplesLinq.UsingIEnumerable(Enumerable.Range(1, 50));
			Console.WriteLine("");
            samplesLinq.UsingProjection(Enumerable.Range(1, 50));
			Console.WriteLine("");
			samplesLinq.UsingOrderBy(new[] { "A", "C", "B", "E", "Q" });
			Console.WriteLine("");
            samplesLinq.UsingFacilitators(new[] { "A", "B", "A", "C", "A", "D" });
			Console.WriteLine("");
			samplesLinq.UsingAggregates(Enumerable.Range(1, 50));
            Console.WriteLine("");
			samplesLinq.UsingDictionary(new Dictionary<string, string>(){ {"1", "B"}, {"2", "A"}, {"3", "B"}, {"4", "A"},});
			Console.WriteLine("");
			samplesLinq.UsingDictionary(
				new Dictionary<string, string>(){ {"1", "B"}, {"2", "A"}, {"3", "B"}, {"4", "A"},}, 
				new Dictionary<string, string>() {{"5", "B"}, {"6", "A"}, {"7", "B"}, {"8", "A"},});
        }
		
    }
	
	public class SamplesLinq
	{
		public void UsingIEnumerable(IEnumerable<int> data)
		{
			var method = // IEnumerable<string>
                 data.Where(x => x % 2 == 0)
                 .Select(x => x.ToString());
			Console.WriteLine(string.Join(",", method));
			
            var query = // IEnumerable<string>
                from d in data
                where d % 2 == 0
                select d.ToString();
			Console.WriteLine(string.Join(",", query));
		}
		
		public void UsingProjection(IEnumerable<int> data)
		{
			var projection =
                from d in data
                select new
                {
                    Even = (d % 2 == 0),
                    Odd = !(d % 2 == 0),
                    Value = d,
                };
			Console.WriteLine(string.Join(",", projection));
		}	
		
		public void UsingOrderBy(IEnumerable<string> letters)
		{
			var sortAsc =
                from d in letters
                orderby d ascending
                select d;
			Console.WriteLine(string.Join(",", sortAsc));

            var sortDesc =
                letters.OrderByDescending(x => x);
			Console.WriteLine(string.Join(",", sortDesc));
		}
		
		public void UsingFacilitators(IEnumerable<string> values)
		{
			var distinct = values.Distinct();
			Console.WriteLine(string.Join(",", distinct));
            var first = values.First();
			Console.WriteLine(string.Join(",", first));
            var firstOr = values.FirstOrDefault();
			Console.WriteLine(string.Join(",", firstOr));
            var last = values.Last();
			Console.WriteLine(string.Join(",", last));
            var page = values.Skip(2).Take(2);
			Console.WriteLine(string.Join(",", page));
		}
		
		public void UsingAggregates(IEnumerable<int> numbers)
		{
            var any = numbers.Any(x => x % 2 == 0);
			Console.WriteLine(string.Join(",", any));
            var count = numbers.Count(x => x % 2 == 0);
			Console.WriteLine(string.Join(",", count));
            var sum = numbers.Sum();
			Console.WriteLine(string.Join(",", sum));
            var max = numbers.Max();
			Console.WriteLine(string.Join(",", max));
            var min = numbers.Min();
			Console.WriteLine(string.Join(",", min));
            var avg = numbers.Average();
			Console.WriteLine(string.Join(",", avg));
		}
		
		public void UsingDictionary(Dictionary<string, string> dictionary)
		{
			var group = // IEnumerable<string, IEnumerable<string>>
                from d1 in dictionary
                group d1 by d1.Value into g
                select new
                {
                    Key = g.Key,
                    Members = g,
                };
			Console.WriteLine(string.Join(",", group));
		}
		
		public void UsingDictionary(Dictionary<string, string> dictionary1, Dictionary<string, string> dictionary2)
		{
			var join =
                from d1 in dictionary1
                join d2 in dictionary2 on d1.Value equals d2.Value
                select new
                {
                    Key1 = d1.Key,
                    Key2 = d2.Key,
                    Value = d1.Value
                };
			Console.WriteLine(string.Join(",", join));
		}
	}	
}

Ao executar temos a seguinte saída

2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50
2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50

{ Even = False, Odd = True, Value = 1 },{ Even = True, Odd = False, Value = 2 },{ Even = False, Odd = True, Value = 3 },{ Even = True, Odd = False, Value = 4 },{ Even = False, Odd = True, Value = 5 },{ Even = True, Odd = False, Value = 6 },{ Even = False, Odd = True, Value = 7 },{ Even = True, Odd = False, Value = 8 },{ Even = False, Odd = True, Value = 9 },{ Even = True, Odd = False, Value = 10 },{ Even = False, Odd = True, Value = 11 },{ Even = True, Odd = False, Value = 12 },{ Even = False, Odd = True, Value = 13 },{ Even = True, Odd = False, Value = 14 },{ Even = False, Odd = True, Value = 15 },{ Even = True, Odd = False, Value = 16 },{ Even = False, Odd = True, Value = 17 },{ Even = True, Odd = False, Value = 18 },{ Even = False, Odd = True, Value = 19 },{ Even = True, Odd = False, Value = 20 },{ Even = False, Odd = True, Value = 21 },{ Even = True, Odd = False, Value = 22 },{ Even = False, Odd = True, Value = 23 },{ Even = True, Odd = False, Value = 24 },{ Even = False, Odd = True, Value = 25 },{ Even = True, Odd = False, Value = 26 },{ Even = False, Odd = True, Value = 27 },{ Even = True, Odd = False, Value = 28 },{ Even = False, Odd = True, Value = 29 },{ Even = True, Odd = False, Value = 30 },{ Even = False, Odd = True, Value = 31 },{ Even = True, Odd = False, Value = 32 },{ Even = False, Odd = True, Value = 33 },{ Even = True, Odd = False, Value = 34 },{ Even = False, Odd = True, Value = 35 },{ Even = True, Odd = False, Value = 36 },{ Even = False, Odd = True, Value = 37 },{ Even = True, Odd = False, Value = 38 },{ Even = False, Odd = True, Value = 39 },{ Even = True, Odd = False, Value = 40 },{ Even = False, Odd = True, Value = 41 },{ Even = True, Odd = False, Value = 42 },{ Even = False, Odd = True, Value = 43 },{ Even = True, Odd = False, Value = 44 },{ Even = False, Odd = True, Value = 45 },{ Even = True, Odd = False, Value = 46 },{ Even = False, Odd = True, Value = 47 },{ Even = True, Odd = False, Value = 48 },{ Even = False, Odd = True, Value = 49 },{ Even = True, Odd = False, Value = 50 }

A,B,C,E,Q
Q,E,C,B,A

A,B,C,D
A
A
D
A,C

True
25
1275
50
1
25.5

{ Key = B, Members = System.Linq.Lookup`2+Grouping[System.String,System.Collections.Generic.KeyValuePair`2[System.String,System.String]] },{ Key = A, Members = System.Linq.Lookup`2+Grouping[System.String,System.Collections.Generic.KeyValuePair`2[System.String,System.String]] }

{ Key1 = 1, Key2 = 5, Value = B },{ Key1 = 1, Key2 = 7, Value = B },{ Key1 = 2, Key2 = 6, Value = A },{ Key1 = 2, Key2 = 8, Value = A },{ Key1 = 3, Key2 = 5, Value = B },{ Key1 = 3, Key2 = 7, Value = B },{ Key1 = 4, Key2 = 6, Value = A },{ Key1 = 4, Key2 = 8, Value = A }

A documentação da Microsoft é bem didática e recomendo-a todos que ainda tem dúvidas ou querem saber mais sobre o tema.

Qualquer dúvida ou dicas, entre em contato: leandrolt@gmail.com

Leave a Reply

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